作者:互粉-结局_596 | 来源:互联网 | 2023-09-04 17:20
学习python,从入门到放弃(49)web框架web框架:将前端、数据库整合到一起的基于互联网传输的python代码web框架也可以简单的理解为是软件开发架构里面的服务端搭建简易
学习python,从入门到放弃(49)
web框架
web框架:将前端、数据库整合到一起的基于互联网传输的python代码
web框架也可以简单的理解为是软件开发架构里面的'服务端'
搭建简易版本服务端
socket模块
遵循HTTP协议
四大特性、数据格式、响应状态码
基于不同的后缀响应不同的内容
如何获取用户输入的url后缀>>>:HTTP请求数据
/favicon.ico直接忽略 不影响判断
利用字符串切割和索引取值获取相应数据
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)
while True:
sock, addr = server.accept()
data = sock.recv(1024)
# 将请求相关数据先转成字符串
data_str = data.decode('utf8') # 'GET /login HTTP/1.1\r\nHost: 127.0.0.1:8081\r\n......'
sock.send(b'HTTP1.1 200 OK\r\n\r\n')
# 然后去字符串中截取出我们需要的内容(按照空格切割字符串 获取第二个元素即可)
current_path = data_str.split(' ')[1]
# 根据后缀的不同返回不同的内容
if current_path == '/login':
sock.send(b'hello login!!!')
elif current_path == '/register':
sock.send(b'hello register')
else:
sock.send(b'404 error')
缺陷:
1.服务端起始代码过于重复
2.针对HTTP请求数据没有完善的处理方式
3.并发量问题
基于wsgiref模块
利用模块搭建服务端
利用模块处理好的HTTP字典数据编写业务
查找用户url后缀对象的键值对数据
from wsgiref import simple_server
def run(request, response):
response('200 OK', []) # 固定编写 无需掌握
current_path = request.get("PATH_INFO")
if current_path == '/login':
return [b'hello login html']
elif current_path == '/register':
return [b'hello register html']
return [b'404 error']
if __name__ == '__main__':
server = simple_server.make_server('127.0.0.1', 8080, run)
'''一致监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
server.serve_forever()
优化措施
问题:
1.如果网站很多,就是添加elif
2.每个分支下的功能根据业务逻辑的不同可能会比较复杂
解决:
将匹配和功能封装成,元组和函数
所有的代码全部放在一个py文件过于冗余,不便于后期管理维护
根据功能的不同拆分成不同的py文件
urls.py 对应关系的存储
views.py 业务逻辑的编写
想新增功能,只需要在urls.py中添加对应关系,view.py中编写函数
业务函数的代码中,可能会频繁的使用到不同的html页面,为了避免文件类型的混乱,单独开设一个文件夹存储所有的html文件。
templates文件夹 存储项目所需的html文件
项目中的html文件,也有可能需要用到css、js、第三方框架文件。
html所学的css、js、第三方框架代码都是写完之后很少做改动的文件 所以可以统一存放在某个文件夹下
static文件夹 存储项目所需的'静态文件'
基于上述优化之后,整个项目结构清晰,管理维护都很方便。
动静态网页
静态网页
页面上的数据是直接写死的,万年不变。
动态网页
页面上的数据是通过代码动态获取的,实时可变。
页面上展示当前时间
def get_time(request):
# 1.获取当前时间
import time
c_time = time.strftime('%Y-%m-%d %X')
# 2.读取html文件
with open(r'templates/get_time.html','r',encoding='utf8') as f:
data = f.read()
new_data = data.replace('asdaksdjal',c_time)
return new_data
jinja2模块
在编写前后端不分离项目的时候,可以使用该模块提供的模板语法简单快速的在html页面是使用类似于后端的代码语法操作数据。
模板
temp_obj.render({'user':user_dict,'new_list':new_list}){{ user }}
{{ user.name }}
{{ user['pwd'] }}
{{ user.get('hobby') }}
{% for i in new_list %}
元素:{{ i }}
{% endfor %}
也可以获取数据库中的数据展示到前端页面
框架请求流程
urls.py
后缀与函数名对应关系
('/index',register)
后缀专业名词称之为'路由'
函数名专业名词称之为'视图函数'
urls.py专业名词称之为'路由层'
views.py
专门编写业务逻辑代码
可以是函数 也可以是类
函数专业名词称之为'视图函数'
类专业名词称之为'视图类'
views.py专业名词称之为'视图层'
templates文件夹
专门存储html文件
html文件专业名词称之为'模板文件'
templates文件夹专业名词称之为'模板层'
python主流web框架
flask的第三方模块加到一起甚至比django还多,并且也越来越像django。flask由于过多的依赖于第三方模块,有时候也会受制于第三方模块。
框架的核心逻辑几乎是一致的,我们在学习的时候只需要先学会一种
之后就可以触类旁通,但是需要强调的是:千万不用同时学习,因为非常容易混淆。
django框架
django本身类似于是一个空壳子,真正的功能是由里面的各个应用决定。
命令操作django
创建django项目
django-admin startproject 项目名(mysite)
启动django项目
cd 项目名(mysite) python3 manage.py runserver IP:PORT
创建app应用
python3 manage.py startapp 应用名(app01)
命令行无法自动创建模板文件夹,需要自己执行命令创建。
pycharm操作django
new project
选择django 填写应用即可,pycharm默认会自动帮你创建模板文件夹 并提供创建一个app的功能
创建更多的app
tools
run manage.py task 命令自动提示
启动项目
接点击绿色箭头
还可以修改端口号 edit configurations
使用django写一个淘宝,我们应该先创建一个空的django项目然后根据功能的不同创建不同的应用
django项目
app01(user)
app02(order)
app03(goods)
app04(backend)
django主要文件介绍
项目文件名
同名文件夹
settings.py 项目配置文件
urls.py 路由层
manage.py
django入口文件 很多命令都需要该文件支持
db.sqlite3
django启动之后才会生成的文件 其实就是django自带的小型数据库
templates文件夹
模板层
app01应用文件夹
migrations文件夹 数据迁移记录
admin.py django自带的后台管理
apps.py 用于app的注册
models.py 专门用于操作数据库
views.py 视图层
创建应用之后 一定要去配置文件中注册才能生效
'app01.apps.App01Config' 完整语法
'app01' 简写语法