纯手撸简易版本web框架
"""
1.代码过于冗余
2.处理http数据繁杂
"""
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn, addr = server.accept()
data = conn.recv(1024)
data = data.decode('utf8')
print(data)
target_url = data.split(' ')[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
if target_url == '/index':
conn.send(b'from index')
elif target_url == '/login':
conn.send(b'from login')
elif target_url == '/func':
with open(r'myhtml.html','rb') as f:
for line in f:
conn.send(line)
else:
conn.send(b'404 error')
wsgiref模块
from wsgiref.simple_server import make_server
def run(request, response):
"""
:param request:跟请求相关的数据
:param response: 跟响应相关的数据
:return: 返回值就是要给前端浏览器的数据
"""
response('200 OK',[])
target_url = request.get('PATH_INFO')
if target_url == '/index':
return [b'from index']
elif target_url == '/login':
return [b'from login']
return [b'hello world']
if __name__ == '__main__':
server = make_server('127.0.0.1', 8080, run)
server.serve_forever()
变形优化
针对后缀较多的情况 如何更加优化匹配
def register():
return 'register页面'
urls = [
('/index',index),
('/login',login),
('/reg',register)
]
'''以后新增功能只需要先写一个函数 然后加一组对应关系即可'''
针对同一个py文件内部代码功能繁杂的情况 拆分多个py文件
views.py 专门用于存放核心业务逻辑
urls.py 专门用于存放路径对应关系
templates 专门用于存放html文件
'''以后新增功能只需要views.py写函数 然后urls.py写对应关系即可'''
动静态网页
动静态网页
动态网页
数据不是直接写死在html页面上的 而是动态获取(后端)
静态网页
数据是直接写死在页面上的
使用我们自己写的web框架 完成一个动态页面的返回
jinja2模块
该模块提供了"模板语法"
支持后端给html页面传递数据并且支持后端语法
pip3 install jinja2
<h1>{{user_dict}}</h1>
<h1>{{user_dict['username']}}</h1>
<h1>{{user_dict.get('pwd')}}</h1>
<h1>{{user_dict.hobby}}</h1>
<div>
{% for key in user_dict%}
<p>{{ key }}</p>
{% endfor %}
</div>
课堂练习
将数据库的表数据利用模板语法展示到前端页面
python主流web框架
'''千万不要同时学习多个框架!!!'''
django框架
大而全 内部自带的组件特别特别多 类似于航空母舰
有时候可能会过于"笨重"
flask框架
小而精 内部几乎没有什么自带的组件 全部依赖于第三方模块 类似于游骑兵
如果将flask所有的第三方模块集合到一起甚至可以盖过django
有时候可能会出现第三方模块无法兼容的情况
tornado框架
异步非阻塞
"""
同步异步
同步:提交任务之后原地等待任务的返回结果 期间不做任何事
异步:提交任务之后不原地等待任务返回结果 有结果会通过回调机制反馈
阻塞非阻塞
阻塞:程序被剥夺了CPU执行权限
非阻塞:运行态 就绪态
"""
A:socket部分
B:路由匹配
C:模板语法
django
A:不是自己写的 用的wsgiref模块
B:自己写的
C:自己写的
flask
A:不是自己写的 werkzeug(依赖于wsgiref模块)
B:自己写的
C:不是自己写的 jinja2
Tornado
A,B,C全部都是自己写的
知识储备:
fastapi框架
异步框架
django框架
django版本问题
django1.X
django2.X
django3.X
"""
3.X支持异步(但是目前写的不好)
1.X 2.X 3.X在使用上几乎没有太大差距
针对django版本我们以1.11.11为学习对象
pip3 install django==1.11.11
"""
验证django是否下载完毕
django-admin
django基本使用
命令行
1.创建django项目
django-admin startproject 项目名
2.如何运行django项目
切到项目目录下
cd 项目名
python3 manage.py runserver
3.创建app
python3 manage.py startapp app名字
"""
命令行创建不会自动创建templates文件夹 并且配置文件中也不会配置
需要自己创建文件夹并配置
os.path.join(BASE_DIR, 'templates')
"""
什么是app
django相当于一所大学(空壳子)
app相当于大学里面的各个学院(功能主题)
"""
django项目与app之间的关系
django项目是空壳子 app才是真正的核心 相当于一个个独立的功能模块
"""
# django启动报错的各种情况
1.python解释器问题
widgets.py多了个逗号
2.由于版本问题导致配置文件配置项错误
[os.path.join(BASE_DIR,'templates')]
3.计算机名称和py文件等名称尽量不要使用中文
# 命令行操作不会自动帮你创建templates文件夹并且也不会在文件中配置