web框架推导
# 1.web框架是基于互联网的web服务端
连接前端与数据库的中间介质
# 2.学习web框架必备知识:
1.socket服务端代码
2.HTTP协>>>:四大特性
# 3.web框架可以根据路由的不同请求不同内容
路由指的是web开发中根据url分配到对应的处理程序
# 4.请求方式:
get 朝服务端索要数据
post 超服务端提交数据
# 5.手写的web框架缺点
1.socket代码过于重复
2.针对请求数据格式的处理复杂且重复
3.针对不同路由的匹配太low了
# 6.代码
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
sock, address = server.accept()
data = sock.recv(1024)
sock.send(b'HTTP/1.1 200 OK\r\n\r\nhello this is my wed')
target_url = data.decode('utf8').split(' ')[1]
if target_url == '/index':
sock.send(b'index view')
elif target_url == '/login':
sock.send(b'login view')
else:
sock.send(b'404 error')
基于wsgiref模块改进
# 1.wsgiref模块介绍
wsgiref模块内部封装了socket代码对请求数据的处理
# 2.模块的导入
from wsgiref.simple_server import make_server
# 3.封装后的代码
from wsgiref.simple_server import make_server
def run(request, response):
"""
:param request: 请求数据
:param response: 响应数据
:return: 返回给客户端的数据
"""
print(request)
response('200 OK', []) # 固定代码无需掌握
return [b'hello big baby']
if __name__ == '__main__':
# 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
server = make_server('127.0.0.1', 8080, run)
server.serve_forever() # 永久启动
# 4.缺点分析
- 后续如果添加新的网页不便于管理,将代码进行封装优化按照软件开发目录规范管理
- 代码:
from wsgiref.simple_server import make_server
def index(request):
return 'index'
def login(request):
return 'login'
def error(request):
return '404 not found'
urls = (
('/index',index),
('/login',login),
)
def run(request, response):
"""
:param request: 请求数据
:param response: 响应数据
:return: 返回给客户端的数据
"""
response('200 OK', []) # 固定代码无需掌握
target_path = request.get('PATH_INFO')
func_name = None
for url_tp in urls: # ('/index',index),
if url_tp[0] == target_path:
func_name = url_tp[1] # 存储匹配到的函数吗,方便后续调用
break # 一旦匹配到内容直接结束for循环
# for循环结束后需要判断func_name是否还为空,
if func_name:
res = func_name(request)
else:
res = error(request)
return [res.encode('utf8')] # 统一编码处理,函数返回字符串操作更简单
if __name__ == '__main__':
# 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
server = make_server('127.0.0.1', 8080, run)
server.serve_forever() # 永久启动
# 5.软开管理规范
- 根据py文件中功能的不同划分到不同的py文件(模块化)
urls.py 对应关系
views.py 功能函数
start.py 启动文件
templates文件夹 存储html
动静态网页
# 1.动态网页
页面上的数据是动态获取的,来自后端传入
# 2.静态网页
页面的数据是死的,需要修改源码才能修改数据
# 3.通过后端代码实现前端展示后端所写内容
1.通过文件读写,在前端设置字符串类型,在后端将字符串进行替换
2.将字典传递给页面内容,在页面上通过jinja2模块模板语法对其进行操作
jinja2模板语法
# 1.jinja2模块下载
pip3 install jinja2
# 2.使用jinja2实现后端字典数据传递给前端,并且拿到其中一个键或值
- 后端代码:
from jinja2 import Template
def get_dict(request):
user_dict = {'id': 1, 'name': 'tom', 'age': 18, 'hobby': ['ring', 'run']}
with open(r'templates/my01.html','r',encoding='utf8') as f:
data = f.read()
temp =Template(data)
res = temp.render(data=user_dict) # 将字典传递给html页面,页面通过data就能获取
return res
- 前端html内的:
# 3.jinja2模板语法(前端操作后端)
- 1.字典取值(四种方式)
<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1>
2.数据库表单展示
{% for user in user_data %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
</tr>
{% endfor %}
前后端与数据库联动
# 步骤
1.前端浏览器访问get_user
2.后端连接数据库查询use表中所有的数据
3.后端将数据传递到某个html页面
4.前端弄好样式,再发送给浏览器展示
{% for user_dict in user_data_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.age }}</td>
</tr>
{% endfor %}
python主流web框架简介
# 1.django框架
大而全 自身携带的功能非常的多
缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
# 2.flask框架
小而精,自身携带的功能非常的少,依赖于第三方模块
缺陷:受限于第三方模块的开发
# 3.tornado框架
异步非阻塞框架 该框架快到可以作为游戏服务器
缺陷:上手难度是三者最高的
# 4.fastapi框架、sanic框架、...
最近流行的
django简介
# 1.版本问题
1.X:同步 1.11
2.X:同步 2.2
3.X:异步 3.2
"""无论使用什么版本都可以 区别不大"""
# 2.启动注意事项
- 1.计算机名称尽量不要有中文
- 2.项目中所有的py文件名尽量不要用中文
- 3.不同版本的python解释器配合不同版本的django,会有一些报错
"""仔细查找一下报错信息,里面会提示你是哪个py文件里面的代码出错,找到那一行代码,把逗号删除即可"""
- 4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套
django使用
# 1.下载
pip3 install django 默认最新版
pip3 install django==版本号 指定版本
pip3 install django==2.2.22
pip下载模块会自动解决依赖问题(会把关联需要用到的模块一起下了)
pip3 uninstall django 卸载django
-i https://pypi.tuna.tsinghua.edu.cn/simple/ 换源
# 2.验证django是否下载成功
cmd终端输入django-admin
# 3.cmd命令操作
- 1.创建django项目
django-admin startproject 项目名
- 2.启动django项目
1.先切换到项目目录下 cd 项目名
2.执行启动目录 python38 manage.py runserver ip:port
# ip:port 本机可不写
- 3.访问django服务端
浏览器直接访问
- 4.创建app应用
python38 manage.py startapp 应用名
"""
django框架类似于是一个空壳子 给你提供所需的资源,至于到底要写哪些功能 需要通过创建app来划分
eg:django初始项目可以看成是一所大学,app就相当于是大学里面的各个学院
"""
# 4.pycharm操作(new project>>>django(鼠标控制))
在启动django项目的时候,一定要确保一个端口只有一个项目。
# 5.命令行与pycharm操作的区别
- 1.命令行不会自动创建templates文件夹
- 2.命令行不会在配置文件编写关于templates文件夹的配置
"""'DIRS': [os.path.join(BASE_DIR, 'templates')]"""
- 3.pycharm自动创建的第一个应用会自动注册到配置文件中
- 4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来
django目录结构
# 1. 项目同名文件夹
1. __init__.py 很少用 主要做一些冷门配置
2. settings.py 项目配置文件
3. urls.py 对应关系(目前简单的理解:网址后缀跟函数名)
4. wsgi.py django服务 基本不用
5. manage.py django入口文件
# 2. templates文件夹 存储项目所需的html文件
# 3. 应用名文件夹(可以有多个)
1. migrations文件夹 orm相关(数据库打交道的记录)
2.__init__.py 很少用主要做一些冷门配置
3.admin.py django自带的后台管理
4.apps.py 创建应用之后用于应用的注册
5.models.py 存储与数据库表相关的类
6.tests.py 自带的测试文件
7.views.py 存储业务相关的逻辑代码(函数、类)
# 4.db.sqlite3 自带的小型数据库
# 5.重要知识
urls.py 路由层
views.py 视图层
templates 模板层
models.py 模型层
# 6.导入方式
from django.template import Template, TemplateDoesNotExist
"""django一般会自己创建该模块,建议缺什么补什么"""
django三板斧
# 1.导入
from django.shortcuts import render,HttpResponse,redirect
"""
HttpResponse 返回字符串类型的数据
render 返回html页面并且支持传值
redirect 重定向
"""