web服务器之mini_frame框架demo

匿名 (未验证) 提交于 2019-12-03 00:27:02

dynamic/mini_frame.py

import re import pymysql import urllib.parse import logging   URL_FUNC_DICT = dict() """ URL_FUNC_DICT = {         "/index.py" : index,         "/center.py" : center,         } """ # func_list = list()  def route(url):     def set_func(func):         # func_list.append(func)         URL_FUNC_DICT[url] = func         def call_func(*args, **kwargs):             return func(*args, **kwargs)         return call_func     return set_func   @route(r"/index.html") def index(ret):     with open("./templates/index.html") as f:         content = f.read()     # my_stock_info = "这里是从mysql中查询出来的数据2..."     # content =  re.sub(r"\{%content%\}",my_stock_info, content)       conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')     cursor = conn.cursor()     cursor.execute("select * from info;")     stock_info = cursor.fetchall()     cursor.close()     conn.close()     tr_template = """<tr>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>     <input type="button" value="添加" id="toAdd" name="toAdd" systemidvaule="%s">     </td>     </tr>     """     html = ""     for line_info in stock_info:         html += tr_template % (line_info[0],line_info[1],line_info[2],line_info[3],line_info[4],line_info[5],line_info[6],line_info[7],line_info[1])     content =  re.sub(r"\{%content%\}",html, content)     return content   @route(r"/center.html") def center(ret):     with open("./templates/center.html") as f:         content = f.read()     # my_stock_info = "这里是从mysql中查询出来的数据..."      conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')     cursor = conn.cursor()     cursor.execute("select i.code , i.short , i.chg, i.turnover, i.price, i.highs , f.note_info  from info as i inner join focus as f on i.id = f.info_id;")     stock_info = cursor.fetchall()     cursor.close()     conn.close()     tr_template = """<tr>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>%s</td>     <td>         <a type="button" class="btn btn-default btn-xs" href="/update/%s.html"> <span class="glyphicon glyphicon-star" aria-hidden="true"></span> 修改 </a>     </td>     <td>         <input type="button" value="删除" id="toDel" name="toDel" systemidvaule="%s">     </td>     </tr>     """     html = ""     for line_info in stock_info:         html += tr_template % (line_info[0],line_info[1],line_info[2],line_info[3],line_info[4],line_info[5],line_info[6],line_info[0],line_info[0])     content =  re.sub(r"\{%content%\}",html, content)     return content    @route(r"/add/(\d+).html") def add_focus(ret):     # print("add_fouces")     # 1. 获取股票code     stock_code = ret.group(1)     # 2.判断是否已经有这只股票     conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')     cursor = conn.cursor()     cursor.execute("select * from info where code = %s;", (stock_code, ))     # 如果没有这个股票代码, 那么就任务是非法请求     if not  cursor.fetchone():         cursor.close()         conn.close()         return "没有这支股票,..大哥, 我们是创业公司, 请手下留情...."      #3.判断是否已经关注过     cursor.execute("""select * from info as i inner join focus as f on i.id=f.info_id where i.code=%s;""", (stock_code , ))     if cursor.fetchone():         cursor.close()         conn.close()         return "已经关注过这支股票了....不用再点了"          #4.添加关注     cursor.execute("insert into focus (info_id) select id from info where code = %s;" , (stock_code , ))     conn.commit()     cursor.close()     conn.close()     return "添加成功"   @route(r"/del/(\d+).html") def del_focus(ret):     # 1. 获取股票code     stock_code = ret.group(1)      # 2.判断是否已经有这只股票     conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')     cursor = conn.cursor()     cursor.execute("select * from info where code = %s;", (stock_code, ))     # 如果没有这个股票代码, 那么就任务是非法请求     if not  cursor.fetchone():         cursor.close()         conn.close()         return "没有这支股票,..大哥, 我们是创业公司, 请手下留情...."      #3.判断是否已经关注过     cursor.execute("""select * from info as i inner join focus as f on i.id=f.info_id where i.code=%s;""", (stock_code , ))     if not cursor.fetchone():         cursor.close()         conn.close()         return "%s之前就没有关注过这支股票了....请勿取消关注" % stock_code          #4.取消关注     cursor.execute("delete from focus where info_id =(select id from info where code = %s);" , (stock_code , ))     conn.commit()     cursor.close()     conn.close()     return "取消成功"  @route(r"/update/(\d+)\.html") def show_update_page(ret):     """显示修改的那个页面"""     # 1.获取股票代码     stock_code = ret.group(1)     # 2.打开模板     with open("./templates/update.html") as f:         content = f.read()     # 3. 根据股票信息查询相关信息     conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')     cursor = conn.cursor()     cursor.execute("select f.note_info from focus as f inner join info as i on i.id=f.info_id where i.code=%s;", (stock_code, ))     stock_info = cursor.fetchone()     note_info = stock_info[0] # 获取这支股票的备注信息     cursor.close()     conn.close()      content =  re.sub(r"\{%note_info%\}",note_info, content)     content =  re.sub(r"\{%code%\}",stock_code, content)      return content    @route(r"/update/(\d+)/(.*)\.html") def save_stock_info(ret):     print("save_stock_info")     stock_code = ret.group(1)     comment = ret.group(2)     comment = urllib.parse.unquote(comment)     conn = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')     cursor = conn.cursor()     cursor.execute("update focus set note_info=%s where info_id = (select id from info where code=%s)", (comment,stock_code))     conn.commit()     cursor.close()     conn.close()     return "修改成功...."   def application(environ, start_response):     start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])     file_name = environ['PATH_INFO']     """     if file_name == "/index.py":         return index()     elif file_name == "/center.py":         return center()      """       logging.basicConfig(level=logging.WARNING,filename='./log.txt',filemode='a',format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')       logging.info("访问的是:%s" % file_name)     # return URL_FUNC_DICT[file_name]()         for url , func  in URL_FUNC_DICT.items():         # print("---url = %s " % url)         ret = re.match(url,file_name)         if ret:             return func(ret)     else:         return "请求的rul(%s)没有对应的函数..." % file_name                             

my_web_service_demo.py

import socket  import re import multiprocessing import time #import dynamic.mini_frame import sys  class WSGIService(object):       def __init__(self, port, app, static_path):         self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)         self.tcp_socket.bind(("" , port))         self.tcp_socket.listen(128)         self.application = app         self.static_path = static_path           def service_client(self , new_socket):         request = new_socket.recv(1024).decode("utf-8")         request_list = request.splitlines()                  ret = re.match(r"[^/]+(/[^ ]*)", request_list[0])         if ret:             file_name = ret.group(1)             if file_name == "/":                 file_name = "/index.html"             print(file_name) #        print(request)                  # 如果请求的资源不是以.py 结尾的. 那么就认为是静态资源         if not file_name.endswith(".html"):              try:                 f = open(self.static_path+ file_name, "rb")             except:                 response = "HTTP/1.1 404 NOT FOUND\r\n"                 response += "\r\n"                 response += "---file not found---"                 new_socket.send(response.encode("utf-8"))             else:                 html_content = f.read()                 f.close()                 response = "HTTP/1.1 200 OK\r\n"                 response += "\r\n"                 new_socket.send(response.encode("utf-8"))                 new_socket.send(html_content)                          else:             # 如果以.py 结尾, 那么就认为是动态资源的请求             # body = mini_frame.login()             # body = mini_frame.application(file_name)             env = dict()             env['PATH_INFO'] = file_name             # body = dynamic.mini_frame.application(env ,self.set_response_header)             body = self.application(env ,self.set_response_header)             header = "HTTP/1.1 %s\r\n" % self.status             for temp in self.headers:                 header += "%s:%s\r\n" % (temp[0], temp[1])              header += "\r\n"             response = header + body             new_socket.send(response.encode("utf-8"))          new_socket.close()      def set_response_header(self,status,headers):         self.status = status         self.headers = [("server", "mini_web v8.8")]         self.headers += headers      def run_forever(self):         while True:             new_socket , client_addr = self.tcp_socket.accept()             p = multiprocessing.Process(target = self.service_client , args = (new_socket , ))             # service_client(new_socket)             p.start()             new_socket.close()         self.tcp_socket.close()    def main():     if len(sys.argv) ==3:         try:             port = int(sys.argv[1]) # 端口号             frame_app_name = sys.argv[2] # mini_frame:application         except Exception as ret:             print("端口号有误....")             return     else:         print("请按照以下方式运行:")         print("python3 xxx.py 端口号 框架名...")         return              ret = re.match(r"([^:]+):(.*)",frame_app_name)     if ret:         frame_name = ret.group(1) # mini_frame         app_name = ret.group(2) # application     else:         print("请按照以下方式运行:")         print("python3 xxx.py 端口号 框架名...")         return      with open("./web_server.conf") as f:         conf_info = eval(f.read())      # 增加目录的上一级     sys.path.append(conf_info['dynamic_path'])     frame = __import__(frame_name) # 返回值标记的这个导入的OK     app = getattr(frame, app_name)# 此时app 只想了dynamic中的application函数     # print(app)      wsgi_server = WSGIService(port, app, conf_info['static_path'])     wsgi_server.run_forever()  if __name__ == "__main__":     main() 



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!