## django ## 纯手撸web框架 1. web框架的本质 理解1:连接前端与数据库的中间介质 理解2:socket服务端 2. 手写web框架 1. 编写socket服务端代码 2. 浏览器访问响应无效>>>:HTTP协议 3. 根据网址后缀不同获取不同的页面内容 4. 想办法就获取到用户输入的后缀>>:请求数据 5. 请求首行 ```python GET /index HTTP/1.1 GET请求:朝别人索要数据 POST请求 朝别人提交数据 ``` 6. 处理请求数据获取网页后缀 项目目录>>`server.py` 服务端与启动页面 ```python import socket from urls import * server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('127.0.0.1', 8888)) server.listen(5) while True: conn, addr = server.accept() res = conn.recv(1024).decode('utf8') print(res) data_url = res.split(' ')[1] conn.send(b'HTTP/1.1 200ok\r\n\r\n') for data_list in func_list: if data_list[0] == data_url: res = data_list[1]() conn.send(res.encode('utf8')) break else: print('没找到',data_url) conn.send(b'hello user') ``` 项目目录>`urls.py` 记录网址后缀与功能函数的关系 ```python from views import * func_list = [ ('/index', index_func), ('/', index_func), ('/user', user_func), ('/login', login_func), ] ``` 项目目录>`views.py` 功能函数集合 ```python def index_func(): with open(r'templates/home.html', 'rt', encoding='utf8') as f: return f.read() def user_func(): res = 'hello user_func' return res def login_func(): res = 'hello login_func' return res ``` 项目目录>`templates文件夹`>各种静态html页面文件 home.html ```html Title 主页 ``` ### 成功  ### 手写框架问题 1. socket代码过于重复 2. 怎对请求数据处理繁琐 3. 后缀匹配逻辑过于LowB ## 基于wsgiref模块 内置模块 很多web框架底层使用的模块 功能1:封装了socket代码 功能2:处理了请求数据 1. 固定代码启动服务端 2. 查看处理之后的request大字典 3. 根据不同的网址后缀返回不同的内容>>>:研究大字典键值对 4. 立刻解决上诉纯手撸的两个问题 5. 怎对最后一个问题代码动态网页优化 ```python from wsgiref.simple_server import make_server from urls import * def run(request, response): response('200 ok', []) data_url = request.get('PATH_INFO') ip = request.get('REMOTE_ADDR') user_agent = request.get('HTTP_USER_AGENT') for data_list in func_list: if data_list[0] == data_url: res = data_list[1](request) break else: print('没找到', data_url) res = 'hello user' print(data_url, ip, user_agent) return [res.encode('utf8'),] # 这里返回出去的是列表,里面数据是bytes类型 server = make_server('127.0.0.1', 8889, run) #实时监听127.0.0.1:8889 一旦有请求过来自动给第三个参数加括号并传参数调用 server.serve_forever() #启动服务端 ``` ## 代码封装优化 1. 网址后缀的匹配问题 2. 每个后缀匹配成功后执行的代码有多有少 面条版 函数版 模块版 3. 将分支的代码封装成一个个函数 4. 将网址后缀与函数名做对应关系 5. 获取网址后缀循环匹配 6. 如果想新增功能只需要先写函数再添加对应关系即可 7. 根据不同的功能拆分成不同的py文件项目目录>>`server.py` 服务端与启动页面 ```python from wsgiref.simple_server import make_server from urls import * def run(request, response): response('200 ok', []) data_url = request.get('PATH_INFO') ip = request.get('REMOTE_ADDR') user_agent = request.get('HTTP_USER_AGENT') for data_list in func_list: if data_list[0] == data_url: res = data_list[1](request) break else: print('没找到', data_url) res = 'hello user' print(data_url, ip, user_agent) return [res.encode('utf8'),] server = make_server('127.0.0.1', 8889, run) server.serve_forever() ``` 项目目录>`urls.py` 记录网址后缀与功能函数的关系 ```python from views import * func_list = [ ('/index', index_func), ('/', index_func), ('/user', user_func), ('/login', login_func), ] ``` 项目目录>`views.py` 功能函数集合 ```python def index_func(request): with open(r'templates/home.html', 'rt', encoding='utf8') as f: return f.read() def user_func(request): res = 'hello user_func' return res def login_func(request): res = 'hello login_func' return res ``` 8. 为了使函数体代码中业务逻辑有更多的数据可用 将request大字典在传给这个函数(可以不同但是不能没有) ## 动静态网页 动态网页:页面数据来源于后端 静态网页:页面数据直接写死 1. 访问某个网址后缀 后端代码获取当前时间 并将该时间传到html文件上在返回给浏览器展示给用户看 读取html内容(字符串类型)然后利用字符串替换 最后在返回给浏览器 2. 将字典传递给页面内容 并且在页面上还可以通过类似于后端的操作方式操作该数据 模板语法:jinja2模块 ## jinja2模块 ```python from jinja2 import Template def time_func(request): import time with open(r'templates/time.html', 'r', encoding='utf8') as f: temp_obj = Template(f.read()) #将页面数据交给模板处理 res = temp_obj.render({'d1': {'time': time.strftime("%Y-%m-%d %X")}})#给页面传了一个 变量名是d1值是字典数据的数据 return res {{ d1 }} {{ d1.name }} {{ d1['age'] }} {{ d1.get('person_list') }} ``` html页面 ```html --> Last modification:December 8th, 2022 at 10:00 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Next Previous Comment here is closed
Comment here is closed