MON.初识 Django
纯手撸 Web 框架
HTTP 协议
"""
网络协议
HTTP 协议 明文传输数据
HTTPS 协议 密文传输数据
websocket 协议 密文传输数据
四大特性
1、基于请求响应
2、基于 TCP、IP 作用于应用层之上的协议
3、无状态
3、短/长链接
数据格式
请求首行
请求头
请求体
响应状态码
1xx
2xx 200
3xx 301、302
4xx 403、404
5xx 500
"""
1.socket 代码需要我们自己写
2.HTTP 格式的数据自己处理(只能拿到用户输入的路由)
import socket
server = socket.socket() # 默认为 socket.AF_INET, socket.SOCK_STREAM, 即默认为 TCP 协议
# 绑定本地回环地址
server.bind(('127.0.0.1', 8080))
# 建立半连接池
server.listen(5)
# 建立链接循环
while True:
conn, addr = server.accept()
# noinspection PyBroadException
try:
# 获取数据
data = conn.recv(1024)
# 判断数据是否为空
if len(data) == 0:
break
data = data.decode('utf-8')
if data == 'exit':
break
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
current_path = data.split(' ')[1] # 用以获取不同的后缀
if current_path == '/index':
with open(r'01.html', 'rb') as f:
conn.send(f.read())
elif current_path == '/login':
conn.send(b'Hello Baby~')
conn.send(b'hello web')
except Exception: # 抛出异常
break
conn.close()
补充
业务状态码
eg:
1.用户名不存在
2.密码错误
json.dump({})
def index():
user_dic = {'code': 1001, 'msg': '验证码错误', 'data': []}
def index():
user_dic = {'code': 1002, 'msg': '用户名不存在', 'data': []}
def index():
user_dic = {'code': 1003, 'msg': '密码错误', 'data': []}
3.验证码错误
- 随机生成
- 校验验证码
-- 存入MySQL,表结构(限制次数)
--- id、code、phone、create_time
-- 存入 readis(不限制次数)
--- 存入 session
基于 Wsgiref 模块
1.封装了 socket 代码
2.处理了 HTTP 格式的数据(大字典)
"""
Web 服务网关接口
1.请求来的时候自动拆分 HTTP 格式数据并封装成非常方便处理的数据格式
2.响应结束时将数据再打包,符合 HTTP 格式
"""
根据功能的不同拆分成不同的 py 文件
- urls.py
路由与视图函数对应关系
- views.py(后端业务逻辑)
业务逻辑视图函数
PS:视图函数可以是函数也可以是类
- 面向函数式编程
- 面向对象式编程
- templates 模板文件夹
存储 HTML 文件
# 拆分完成后,后续要想添加功能,仅需在 urls.py 和 views.py 中书写对应的代码即可
动静态网页
'静态网页'
页面上的数据是直接写死的,万年不变
'动态网页'
# 根据 HTML 页面内容是写死的还是从后端动态获取的
1.后端获取当前时间
2.从数据库获取数据
...
"""
如何将后端的数据传递给 HTML 文件(在后段发生的额不再浏览器上)
1.小白版本 利用字符串的替换
2.jinja2 模板语法
即支持给 HTML 传输数据
还提供了一系列快捷方式操作数据(模板语法)
# jinja2 的模板语法极其贴近 Python 语法,并且有时候比 Python 语法更加简介
"""
# 利用 Wsgiref 模块封装的 Web 框架上 jinja2 模板语法,结合前后端数据库
Python 三大主流 Web 框架
1.Django
- 特点:大而全,自带功能特别特别多,类似于航空母舰
- 缺点:太过笨重
2.Flask
- 特点:小而精,自带功能特别特别少,但第三方库特别丰富,类似于美国特种部队,外部支援体系及其庞大
- 缺点:受制于第三方的开发者,容易出现兼容性问题
3.Tornado
- 特点:异步非阻塞,支持高并发,甚至可以支持开发游戏服务器
- 不足之处:入门较难
Web 框架的三大组成部分
A、Socket 部分
B、路由与视图函数对应关系(路由匹配)
C、模板语法
Django
- A 外部的,Wsgiref 模块
- B 内置的
- C 内置的(相较之下没有 Jinja2 好用,但依然很方便)
Flask
- A 外部的,Werkzeug(内部依然是 Wsgiref 模块)
- B 内置的
- C 外部的(Jinja2)
Tornado
- A、B、C 均是内置的
注意事项
# 如何让你的计算机能够正常启动 Django 项目
1.计算机的名称不能有中文
2.一个 Pycharm 窗口只开一个项目
3.项目里面所有的文件也尽量不要出现中文(绝大部分的框架都由外国开发,因此没有考虑中文的编码问题)
4.Python 解释器尽量使用 3.4 - 3.6 之间的版本
- 如果项目报错,点击最后一个报错信息,将源码中最后一个','删掉
# 安装
- 在 Pycharm 中第三方库安装 Django
Django 基本操作
命令行操作
1.创建 Django 项目
django-admin startproject 项目名
- manage.py
- mysite 文件夹
·__init__.py
·settings.py
·urls.py
·wsgi.py
2.启动 Django 项目
- "一定要切换到项目目录下 -- cd /项目名"
- Python3 manage.py runserver
3.创建应用
- python3 manage.py startapp app01 # 应用名应该见名知意
应用
"""
Django 是一款专门用来开发 app 的 Web 框架
Django 框架就类似于一所大学
app 就好比大学里的各个学院,负责不同的专业
一个 app 就是一个独立的功能模块
"""
*******创建的应用一定要去配置文件中注册*******
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# 创建应用之后就立即取配置文件注册!!!!!
PS:在用 Pycharm 创建 Django 项目时,Pycharm 可以创建一个 app应用并自动注册
主要文件介绍
- mysite 项目文件夹
-- mysite 文件夹
--- settings.py 配置文件
--- urls.py 路由与视图函数对应关系(路由层)
--- wsgi.py wsgiref 模块(忽略)
-- manage.py Django 入口文件
-- db.sqlite3 Django 自带的小型数据库
-- app01 文件夹
--- admin.py Django 后台管理
--- app.py 注册使用
--- migrations 文件夹 数据库迁移记录
--- modles.py 数据库相关的 - 模型类(ORM)
--- test.py 测试文件
--- view.py 视图函数(视图层)
Pycharm 操作
1.New Project 选择 Django 即可
2.启动
- 命令行启动
- 在 Pycharm 的终端运行 - python manage.py runserver
- Pycharm 运行按钮启动
3.创建应用
- 在 Pycharm 提供的终端输入完整命令 -- python3 manage.py startapp app01
- Pycharm
- tools
- run manage.py task 提示
4.修改端口号及创建 server
命令行与 Pycharm 创建的区别
Pycharm 会自动创建 templates 文件夹,并且在 settings.py 中自动配置相对应的路径,而命令行不会自动创建 templates 文件夹,且需要手动去配置文件中配置路径
- 'DIRS': [os.path.join(BASE_DIR, 'templates')]