目录
二:基于wsgiref模块写web框架(掌握思路),以及代码的优化
一:纯手撸web框架(思路)
1.什么是web框架?
-
基于互联网的web服务端(socket服务端)
2.请求方式都有哪几种?
-
1.post:向服务端提交数据
-
2.get:向服务端索要数据
3.代码
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
sock, addr = server.accept()
data = sock.recv(1024)
sock.send(b'HTTP/1.1 200 OK \r\n\r\n')
target_url = data.decode('utf8').split(' ')[1]
print(target_url) # / /index /register
if target_url == '/index':
sock.send(b'index')
elif target_url == '/register':
sock.send(b'register')
else:
sock.send(b'404 error')
4.上面代码存在的缺陷
-
1.socket代码冗余
-
2.对请求数据格式的处理复杂且重复
-
3.不同的后缀匹配相应网址的方法太LOW
二:基于wsgiref模块写web框架(思路),以及代码的优化
1.目的:
-
推导django框架的产生过程
-
启动文件
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(request, response):
"""
:param request: 请求数据
:param response: 响应数据
:return: 返回给客户端的数据
"""
response('200 OK', []) # 固定代码
target_path = request.get('PATH_INFO')
func_name = None
for url_tuple in urls:
if url_tuple[0] == target_path:
func_name = url_tuple[1]
break #
if func_name:
res = func_name(request)
else:
res = error(request)
return [res.encode('utf8')]
if __name__ == '__main__':
server = make_server('127.0.0.1', 8080, run)
server.serve_forever() # 永久启动
-
urls.py文件
from views import *
urls = (
('/home', home),
('/index', index),
('/login', login),
('/register', register),
)
-
views.py文件
def index(request):
return 'index'
def login(request):
return 'login'
def register(request):
return 'register'
2.上述代码解决了哪些问题?
-
1.socket代码冗余
-
2.对请求数据格式的处理复杂且重复
三:如何使用jinja2模块
1.功能:
jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
from jinja2 import Template
def get_dict(request):
user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
with open(r'templates/myhtml04.html','r',encoding='utf8') as f:
data = f.read()
temp = Template(data)
res = temp.render(data=user_dict)
return res
四:动静态网页
1.动态网页:页面上的数据是从后端传入的
2.静态网页:页面上的数据是固定写好的,要修改只能修改源码
五:模板语法
<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1>
{% for user in user_data %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
</tr>
{% endfor %}
六:Python主流的web框架
1.django框架
大而全 自身携带的功能非常的多 类似于航空母舰 缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
2.flask框架
小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块 缺陷:受限于第三方模块的开发
3.tornado框架
异步非阻塞 该框架快到可以作为游戏服务器 缺陷:上手难度是三者最高的
4.fastapi框架、sanic框架
最近流行的
七:django框架简介
1.版本:
-
1.x 同步 1.1
-
2.x 同步 2.2
-
3.x 同步 3.2
八:django的基本操作命令
1.创建django项目:django-admin startproject 项目名称
2.启动django项目:
-
1.先切换到项目目录下:cd 项目目录
-
2.执行这个命令:python38 manage.py runserver ip:port
-
3.创建app: python38 manage.py startapp 应用名称
-
4.验证django是否下载成功:cmd终端输入django-admin
九:命令行创建和pycharm创建的django项目的区别
-
1.命令行不会自动创建templates文件夹
-
2.命令行不会在配置文件编写关于templates文件夹的配置 'DIRS': [os.path.join(BASE_DIR, 'templates')]
-
3.pycharm自动创建的第一个应用会自动注册到配置文件中
-
4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来
十:django的目录结构
- settings.py 配置文件
- urls.py 路由层
- wsgi.py django服务 基本不用
- manage.py 入口文件
- templates文件夹 模板层
- migrations文件夹 orm相关的数据库操作记录
- admin.py django自带的后台管理
- models.py 模型层
- tests.py 自带的测试文件
- views.py 视图层
- db.sqlite3 自带的小型数据库
十一:小白必会3板斧
- 1.HttpResponse 返回字符串类型的数据
-
def index(request): return HttpResponse('这是一个视图函数')
- 2.render 返回html页面,支持模板语法
-
def index(request): return render(request, 'index.html')
- 3.redirect 重定向
-
def index(request): return redirect('https://www.baidu.com')
作业:
路由层
urlpatterns = [
path('show_info/', views.show_info),
]
视图层
from jinja2 import Template
import pymysql
def show_info(request):
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='888',
database='dj01',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from userinfo'
cursor.execute(sql)
user_data = cursor.fetchall()
with open(r'templates/1.html', 'r', encoding='utf8') as f:
data = f.read()
temp = Template(data)
res = temp.render(user_data=user_data)
return HttpResponse(res)
html文件
<div class="container">
<div class="row">
<h1 class="text-center">数据展示</h1>
<div class="col-md-8 col-md-offset-2">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>主键</th>
<th>姓名</th>
<th>年龄</th>
<th>爱好</th>
</tr>
</thead>
<tbody>
{% for user in user_data %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.age}}</td>
<td>{{user.hobby}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
结果