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内的:
<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 %}
前后端与数据库联动
# 步骤 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下载模块会自动解决依赖问题(会把关联需要用到的模块一起下了) # 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 重定向 """
标签:web,01,py,request,server,user,django,data From: https://www.cnblogs.com/juzijunjun/p/16966658.html