📅  最后修改于: 2020-05-13 05:24:53             🧑  作者: Mango
先决条件:在Python中创建代理Web服务器–1
在本教程中,添加了一些有趣的功能以使其更有用。
# 检查host:port是否被列入黑名单
for i in range(0, len(config['BLACKLIST_DOMAINS'])):
if config['BLACKLIST_DOMAINS'][i] in url:
conn.close()
return
注意:在接下来的教程中,我们将创建完整的自定义Web服务器,在那里将创建createResponse函数来处理通用响应的创建。
def _ishostAllowed(self, host):
""" 检查是否允许主机访问内容 """
for wildcard in config['HOST_ALLOWED']:
if fnmatch.fnmatch(host, wildcard):
return True
return False
默认主机匹配正则表达式为“ *”,以匹配所有主机。但是,也可以使用形式为“ 192.168.*”的正则表达式。服务器当前正在处理请求,但不显示任何消息,因此我们不知道服务器的状态。为此,请使用日志记录模块,因为它是线程安全的。(如果您还记得服务器是多线程的)
导入模块并设置其初始配置。
logging.basicConfig(level = logging.DEBUG,
format = '[%(CurrentTime)-10s] (%(ThreadName)-10s) %(message)s',)
def log(self, log_level, client, msg):
""" 将消息记录到适当的位置 """
LoggerDict = {
'CurrentTime' : strftime("%a, %d %b %Y %X", localtime()),
'ThreadName' : threading.currentThread().getName()
}
if client == -1: # Main Thread
formatedMSG = msg
else: # 子线程或请求线程
formatedMSG = '{0}:{1} {2}'.format(client[0], client[1], msg)
logging.debug('%s', utils.colorizeLog(config['COLORED_LOGGING'],
log_level, formatedMSG), extra=LoggerDict)
# ColorizePython.py
class pycolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m' # End color
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
模组:
import ColorizePython
方法:
def colorizeLog(shouldColorize, log_level, msg):
# log()参数中的log_level越高,其优先级越低。
colorize_log = {
"NORMAL": ColorizePython.pycolors.ENDC,
"WARNING": ColorizePython.pycolors.WARNING,
"SUCCESS": ColorizePython.pycolors.OKGREEN,
"FAIL": ColorizePython.pycolors.FAIL,
"RESET": ColorizePython.pycolors.ENDC
}
if shouldColorize.lower() == "true":
if log_level in colorize_log:
return colorize_log[str(log_level)] + msg + colorize_log['RESET']
return colorize_log["NORMAL"] + msg + colorize_log["RESET"]
return msg
如果试图加入当前线程,join()会引发RuntimeError,因为这将导致死锁。在线程启动之前,使用join()线程也是错误的,尝试这样做会引发相同的异常。”
因此,适当跳过它,这是相同的代码。
def shutdown(self, signum, frame):
""" 处理现有服务器,清除所有痕迹 """
self.log("WARNING", -1, 'Shutting down gracefully...')
main_thread = threading.currentThread() # Wait for all clients to exit
for t in threading.enumerate():
if t is main_thread:
continue
self.log("FAIL", -1, 'joining ' + t.getName())
t.join()
self.serverSocket.close()
sys.exit(0)