HTTP协议补充
四大特性:
- 基于请求响应
- 基于TCP/IP协议之上的应用层协议
- 无状态 不能保存用户信息(cookie,session,token)
- 短链接
请求数据格式:
请求首行(请求方式,http版本)
请求头
\r\n
请求体(post请求有,get没有)
响应数据格式
响应首行(状态码)
响应头
\r\n
响应体
响应状态码(http协议规定)
200 请求成功 OK
404 请求数据不存在
500 服务器内部错误
业务状态码
一般规定一个正确的,只规定200是正确,其他的全部为异常
eg:
1.用户名不存在
2.验证码错误
1)随机生成 458965
2)校验验证码
存入验证码到数据库(MySQL),表结构
id, code, phone create_time
1 123456 110 2021-10-01 10:10:10
2 123457 110 2021-10-01 11:10:10
3 123458 110 2021-10-01 12:10:10
redis也可以存
如果不限制一天当中,不限制发送次数
存到session中
3.密码错误
json.dumps({})
crm,11 财务12,销售13,主站
def index()
user_dic = {‘code‘:121001, ‘msg‘:‘验证码错误‘,‘data‘:[]}
user_dic = {‘code‘:121002, ‘msg‘:‘用户名不存在‘,‘data‘:[]}
user_dic = {‘code‘:121003, ‘msg‘:‘密码错误‘,‘data‘:[]}
# 如果都正确
user_dic = {‘code‘:200, ‘msg‘:‘OK‘,‘data‘:[]}
return JSONrESPONSE(user_dic)
"""
web简易版框架
import socket
server = socket.socket() # TCP
server.bind((‘127.0.0.1‘, 8080))
server.listen(5)
while True:
sock, addr = server.accept()
# 接收浏览器发送过来的数据
data = sock.recv(1024) # 如果超过1024的数据,出现粘包现象
print(data)
sock.send(b‘HTTP/1.1 200 OK \r\n\r\n‘)
data = data.decode(‘utf-8‘)
current_path = data.split(‘ ‘)[1] # [‘GET‘, ‘/login/‘, ‘‘]
"""
需求:输入不同的后缀,返回不同的内容
1. 知道用户输入的后缀?
2. 做判断,
if path == ‘/index‘
:return ‘index‘
:return index()
"""
# 判断
if current_path == ‘/index/‘:
sock.send(b‘index‘)
elif current_path == ‘/login/‘:
sock.send(b‘login‘)
else:
# 向浏览器发送数据
sock.send(b‘404‘)
sock.close()
wsgiref模块
简易版本
# uwsgi WSGI wsgiref
from wsgiref.simple_server import make_server
from urls import urls
def run(env, response):
"""
:param env: 请求相关的数据
:param response: 响应相关的
:return: 返回值
"""
print(env) # 大字典格式,帮我们封装了http请求过来的所有数据
"""
输入不同的后缀,返回不同的内容
"""
response(‘200 OK‘, [])
current_path = env.get(‘PATH_INFO‘) # /index/
# if current_path == ‘/index/‘:
# res = index() # /index/
# # return [b‘index‘]
# return [res.encode(‘utf-8‘)]
# elif current_path == ‘/login/‘:
# return [b‘login‘]
# return [b‘404‘]
func = None
for url in urls:
# url => (‘/index‘, index),
# current_path => /index /login
if current_path == url[0]: # /index
func = url[1]
break
# func => None , index, login reg 函数内存地址
if func:
res = func()
return [res.encode(‘utf-8‘)]
# return [res]
else:
return [b‘404‘]
if __name__ == ‘__main__‘:
server = make_server(‘127.0.0.1‘, 8080, run)
"""
相当于帮我们实现了socket服务端
实时监听 127.0.0.1:8080,
当请求来的时候,全部交给run方法
注意:
run方法有两个参数
"""
server.serve_forever() # 启动服务端
内部本质:帮我们写了socket服务端
"""
urls.py => 后缀
views.py => 函数
templates => 存html文件 也叫模板
"""
如果在让你加功能,只需要在urls.py中添加一个路径,然后在views中写逻辑就可以了
Django框架
python中主流框架
1. django
特点:大而全,重量级框架
缺点:笨重
2. flask
特点:小而美,轻量级框架,
缺点:依赖于第三方的模块
3. tornado
特点:异步非阻塞,解决高并发问题
缺点:难
创建Django框架
# 1、cmd命令行创建
1. # django-admin startproject mysite
2.启动项目
必须切到项目目录下,跟manage.py同级目录下面 # python3 manage.py runserver
3.创建应用
Next, start your first app by running python manage.py startapp [app_label]. # python3 manage.py startapp app01 # 2、pycharm创建# 命令行创建和pyacharm创建的区别 1.pycharm多了一个templates文件 2. # 命令行创建 TEMPLATES = [ { ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘, ‘DIRS‘: [], } # pycharm创建的 TEMPLATES = [ { ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘, ‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)] } #####################注意事项############################### 创建完应用之后,必须在下面注册应用 INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘app01.apps.App01Config‘, ‘app01‘ ] ####################################################
应用介绍
# 项目就相当于是一所大学应用就相当于是二级学院 1. 计算机学院 2. 土木工程 3. 食品工程 .... eg: 淘宝为例子 1. 用户相关的 user 2.订单相关 order 3.地址相关 address 4. 商品相关 goods # 应用名一定要见名知意### 一个项目至少有一个应用