wed框架推导(django框架前戏)
- 1.wed框架的简单理解
- 基于互联网的wed服务端(socket服务端)
- 2.web框架的一些知识
- 1.socket服务端代码
- 2.HTTP协议 >>>:四大特性
- 3.根据路由的不同请求不同的内容
- 路由:web开发中路由指的是根据url分配到对应的处理程序。
- 4.请求方式
get 朝服务端索要数据 post 朝服务端提交数据 - 5.从请求数据中筛选出用户输入的路由
target_url = data.decode('utf8').split(' ')[1] - 6.代码的缺陷
- 1.socket代码重复编写造轮子
- 2.针对请求数据格式的处理复杂且重复
- 3.针对不同路由的匹配方式过于low
- 7.代码
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模块解决web推导的缺陷
- 1.wsgiref模块介绍
- wsgiref模块内部封装了socket代码与对请求数据的处理
- 2.如何解决socket代码重复编写
- 导入wsdiref模块
from wsgiref.simple_server import make_server
- 导入wsdiref模块
- 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.wsgiref模块解决我们的前两个遇到的问题
但是现在得到的结果,如果后续添加新的网页。是十分不便于管理的,所以需要进行代码封装优化,按照软件开发目录规范进行分类管理- 代码
* 1.面条版代码优化: 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() # 永久启动 * 2.软件开发目录规范分类管理 根据py文件中功能的不同划分到不同的py文件(模块化) urls.py 对应关系 views.py 功能函数 start.py 启动文件 templates文件夹 存储html
- 代码
动静态网页
- 1.动态网页
- 页面上的数据是动态获取的,也就是通过后端传入,例如用户注册登录账户密码的获取
- 2.静态网页
- 直接写死的数据,修改源码才能修改数据,前端所写的页面展示出来的就是静态网页
- 3.需求实现
通过后端代码实现让前端页面展示后端所写的东西 1.可以通过文件读写,然后在前端设置字符串,然后后端把字符安串替换掉的方式实现。 2.但是如果想要实现字典数据传递给html页面并且想要在页面上操作字典数据。我们自己如果不借助第三方模块是实现不了的。
jinja2模块
jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
- 1.jinja2的下载
pip38 install jinja2 - 2.jinja2实现后端字典数据传递给前端,且拿到其中一个键或值
- 导入jinja2模块
from jinja2 import Template- 代码实现
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内的: <p>{{ data }}}</p> - 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 %}
python的框架介绍
- 1.django框架
大而全 自身携带的功能非常的多 缺陷:开发小项目的时候使用该框架有点笨重(大材小用) - 2.flask框架
小而精,自身携带的功能非常的少,依赖于第三方模块 缺陷:受限于第三方模块的开发 - 3.tornado框架
异步非阻塞框架 该框架快到可以作为游戏服务器 缺陷:上手难度是三者最高的 - 4.fastapi框架、sanic框架、...
最近流行的
django框架介绍
- 版本问题
1.X:同步 1.11 2.X:同步 2.2 3.X:异步 3.2
无论使用什么版本都可以 区别不大
- 启动注意事项
- 1.计算机名称尽量不要有中文
- 2.项目中所有的py文件名尽量不要用中文
- 3.不同版本的python解释器配合不同版本的django,会有一些报错
仔细查找一下报错信息,里面会提示你是哪个py文件里面的代码出错,找到那一行代码,把逗号删除即可- 4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套
django基本操作命令
- 1.验证django是否下载成功
cmd终端输入django-admin - 2.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就相当于是大学里面的各个学院 """ - 3.pycharm操作 new project>>>django(鼠标控制)
在启动django项目的时候,一定要确保一个端口只有一个项目。
- 命令行与pycharm操作的区别
- 1.命令行不会自动创建templates文件夹
- 2.命令行不会在配置文件编写关于templates文件夹的配置
'DIRS': [os.path.join(BASE_DIR, 'templates')] - 3.pycharm自动创建的第一个应用会自动注册到配置文件中
- 4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来
django目录文件介绍
- django项目目录
1. 项目同名文件夹 2. __init__.py 很少用 主要做一些冷门配置 3. settings.py 项目配置文件 4. urls.py 对应关系(目前简单的理解:网址后缀跟函数名) 5. wsgi.py django服务 基本不用 6. manage.py django入口文件 7. templates文件夹 存储项目所需的html文件 8. 应用名文件夹(可以有多个) 9. migrations文件夹 orm相关(数据库打交道的记录) 10.__init__.py 很少用主要做一些冷门配置 11.admin.py django自带的后台管理 12.apps.py 创建应用之后用于应用的注册 13.models.py 存储与数据库表相关的类 14.tests.py 自带的测试文件 15.views.py 存储业务相关的逻辑代码(函数、类) 16.db.sqlite3 自带的小型数据库 - 重要知识
urls.py 路由层 views.py 视图层 templates 模板层 models.py 模型层
导入方式:
from django.template import Template, TemplateDoesNotExist
# django一般会自己创建该模块,建议缺什么补什么
- 使用django连接数据库导出数据库表