django 1/手撸web框架/推演/django安装,使用注意事项/
- 手撸web框架
- 基于wsgiref模块
- 动静态网页
- jinja2模块
- 模块语法
- python主流框架
- django框架简介
- django基本操作命令
- 命令行与pycharm操作区别
- django目录结构
- django小白必会三板斧
web框架
用于进行Web开发的一套软件架构,简单理解基于互联网的web服务端>>>socket服务端
推演:
第一次:苗条版,纯手撸框架
第二次:封装函数版(wsgiref)
第三次:模块版。将py文件功能不同的文件划分到不同的py文件中
第一版:面条版
socket服务端代码
1.socket服务端代码
2.http协议
3.根据网址后缀的不同请求不同的内容
4.请求方式 get或者post (get 朝服务器端索要数据 post朝服务端提交数据)
5.从请求数据格式中筛选出用户输入的网址后缀
target_url = date.decode('utf8').split('')[1]
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080)) #ip协议 port协议
server.listen(5) #半连接池
while True:
sock,address = 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]
if target_url == '/index':
sock.send(b'index view')
elif target_url == '/reg':
sock.send(b'reg view')
elif target_url == '/reg':
sock.send(b'reg view')
else:
sock.send(b'404 error')
总结
1.socket 代码重复编写造轮子
2.针对请求数据格式的处理复杂且重复
3.针对HTTP请求数据没有完善的处理方式(目前只能定向切割)
4.针对不同网址后缀的匹配方式过于繁琐
第二版函数版
基于wsgiref模块
wsgiref模块
Web服务器网关接口(WSGI)是Web服务器软件和用Python编
wsgiref 内部封装了socket 代码喝对请求数据的处理
from wsgiref.simple_server import make_server
def run(request, response):
"""
:param request: 请求数据
:param response: 响应数据
:return: 返回给客户端的数据
"""
print(request) # 自动将请求数据全部处理成字典K:v
response('200 ok', []) # 固定代码 无需掌握
return [b'hello big baby']
if __name__ == '__main__':
server = make_server('127.0.0.1', 8081, run) # 任何访问127.0.0.1:8080的请求都会给第三个参数参加括号调用
server.serve_forever() # 永久起动
总结
1.wsgiref模块解决了两个问题
1.socket代码重复编写造轮子
2.针对请求数据格式的处理复杂且重复
2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
先从大字典中查找出记录网址后缀的键值对
1.不推荐使用连续的多个if判断
2.针对面条版的代码首先应该考虑封装成函数
推演最终优化
根据py文件中功能的不同划分到不同的py文件(模块化)
文件名 | |
---|---|
urls.py | 对应关系 |
views.py | 功能函数 |
start.py | 起动文件 |
templates文件夹 | 存储html |
start.py
固定模板不动,start.py文件中调用了wsgiref模块
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') # /login
func_name = None
for url_tuple in urls: # ('/index',index) ('/login',login)
if url_tuple[0] == target_path:
func_name = url_tuple[1] # 先存储匹配到的函数名
break # 一旦匹配到了内容就立刻结束for循环 没有必要继续往下核验了
# for循环结束之后还需要判断func_name是不是为None(有可能没有匹配上)
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', 8081, run) # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
server.serve_forever() # 永久启动
views.py
新增功能都在此处py文件中
#
from jinja2 import Template
def index(request):
return 'index'
def login(request):
return 'login'
def func(request):
with open(r'templates/myhtml02.html','r',encoding='utf8') as f:
data = f.read()
return data
def get_dict(request):
user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
with open(r'myhtml04.html', 'r', encoding='utf8') as f:
data = f.read()
temp = Template(data)
res = temp.render(data=user_dict) # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
return res
def error(request):
return '404 error'
urls.py
添加完新增功能后,在此文件添加对应的功能关系
from views import *
urls = (
('/index', index),
('/login', login),
('/func', func),
('/get_dict', get_dict),
)
templates文件夹
里面存放了相同的功能的文件
myhtml02.html
myhtml04.html
....
流程:运行start.py文件,浏览器访问start.py中固定的127.0.0.1:8081,然后通过拼接,获取到想要访问的内容,内容不存在返回404。
流程图
-------------------------------------------------以上是静态页展示操作---------------------------------------------------
动静态网页
网页 | 说明 |
---|---|
动态网页 | 页面上的数据不是全部写死的,有些是动态获取(后端传入) |
静态网页 | 页面上的数据直接写死的,要想改变只能修改源码 |
实际需求
后端代码回去当前实际,然后让前端页面展示
1.字符串替换
2.将字典数据传递给html页面并且想要在页面上操作字典数据
我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据
jinja2模块
什么是jinja2模块?
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。
jinja2安装
#例子
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) # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
return res
模板语法
<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框架
框架虽然多 但是内部逻辑大差不差 我们重点学习一个即可>>>:django
web框架 | 功能 |
---|---|
django框架 | 大而全 自身携带的功能非常的多 类似于航空母舰 |
缺陷:开发小项目的时候使用该框架有点笨重(大材小用) |
|
flask框架 | 小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块 |
缺陷:受限于第三方模块的开发 |
|
tornado框架 | 异步非阻塞 该框架快到可以作为游戏服务器 |
缺陷:上手难度是三者最高的 |
拓展:
最近流行框架
FastAPI框架: 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。 关键特性: 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
Sanic框架:这次我们来介绍一个 web 框架:Sanic,它既是一个 web 框架,同时也是一个 web 服务器。关于框架,首先浮现在脑海中的就是 Flask、Django 之类的,但它们都是同步框架,而现在是一个高并发的时代,并发量是在构建服务时必须考量的一个指标。所以我们自然就想到了 Python 中的异步框架,而提到异步框架,那么就必须要提 Sanic、FastAPI,这两个异步框架都很优秀,但是 Sanic 的表现要更加出色,使用 Sanic 构建的应用程序足以比肩 Nodejs。如果你再对 Sanic 在路由处理方面使用 C 语言做一些重构,那么并发性能可以和 Go 相媲美。
django框架简介
1.版本问题
1.X:同步 1.11
2.X:同步 2.2
3.X:异步 3.2
ps:你无论使用什么版本都可以 区别不大 2.2
2.启动注意事项
1.计算机名称尽量不要有中文
2.项目中所有的py文件名尽量不要用中文
3.不同版本的python解释器配合不同版本的django 会有一些报错
仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
找到那一行代码 把逗号删除即可
widgets.py 152
4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套
3.验证django是否下载成功
cmd终端输入django-admin
4.创建app应用
"""
django框架类似于是一个空壳子 给你提供所需的资源
至于到底要写哪些功能 需要通过创建app来划分
eg:django初始项目可以看成是一所大学
app就相当于是大学里面的各个学院
"""
python38 manage.py startapp 应用名
pycharm操作
鼠标点点点即可
"""
在启动django项目的时候 一定要确保一个端口只有一个项目
"""
命令行与pycharm操作Django的区别
django项目目录
项目同名文件夹
文件夹名 | 作用 |
---|---|
init.py | 很少用 主要做一些冷门配置 |
settings.py | 项目配置文件 |
urls.py | 对应关系(目前简单的理解:网址后缀跟函数名) |
wsgi.py | django服务 基本不用 |
manage.py | django入口文件 |
templates文件夹 | 存储项目所需的html文件 |
应用名文件夹(可以有多个)
migrations文件夹 orm相关(数据库打交道的记录)
init.py 很少用 主要做一些冷门配置
admin.py django自带的后台管理
apps.py 创建应用之后用于应用的注册
models.py 存储与数据库表相关的类
tests.py 自带的测试文件
views.py 存储业务相关的逻辑代码(函数、类)
db.sqlite3 自带的小型数据库
应用文件夹 | 作用 |
---|---|
migrations文件夹 | orm相关(数据库打交道的记录) |
init.py | 很少用 主要做一些冷门配置 |
admin.py | django自带的后台管理 |
apps.py | 创建应用之后用于应用的注册 |
models.py | 存储与数据库表相关的类 |
tests.py | 自带的测试文件 |
views.py | 存储业务相关的逻辑代码(函数、类) |
db.sqlite3 | 自带的小型数据库 |
urls.py | 路由层 |
---|---|
views.py | 视图层 |
templates | 模板层 |
models.py | 模型层 |
Django小白必会三板斧
名称 | 作用 |
---|---|
httpResponse | 主要用于直接返回字符串类型的数据 |
render | 主要用于1返回html页面 并且支持模板语法 |
redirect | 主要用于页面重定向 |