django学习笔记
今日内容概要
- 纯手撸web框架
- 基于wsgiref模块
- 动静态网页
- jinja2模板语法
- python主流web框架
- django框架简介
- django基本操作命令
- django目录结构
- django小白必会三板斧
今日内容详细
纯手撸web框架
web框架可以简单地理解为是基于互联网的web服务端>>>:socket服务端
1.利用socket模块搭建简易版本的服务端
2.遵循HTTP协议---四大特性,数据格式,响应状态码
3.根据网址后缀的不同请求不同的内容
4.请求方式
GET:朝服务端索要数据
POST:朝服务端提交数据
5.从请求数据格式中筛选出用户输入的网址后缀
target_url = data.decode('utf8').split(' ')[1]
HTTP请求数据;/favicon.ico直接忽略,不影响判断;利用字符串切割和索引取值获取相应数据。
import socket
server = socket.socket() # TCP协议
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')
# print(data.decode('utf8')) # 从字符串中截取出需要的内容
target_url = data.decode('utf8').split(' ')[1] # 用空格切割 / /index /login /reg /xxx
if target_url == '/index':
sock.send(b'index view')
elif target_url == '/login':
sock.send(b'login view')
elif target_url == '/reg':
sock.send(b'reg view')
else:
sock.send(b'404 error')
上述框架的缺陷:
1.socket代码重复编写
2.针对请求数据格式的处理复杂且重复
3.针对不同网址后缀的匹配方式过于低端
基于wsgiref模块
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', 8080, run) # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
server.serve_forever() # 永久启动
wsgiref模块解决了两个问题
1.socket代码重复编写
2.针对请求数据格式的处理复杂且重复
思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
1.从request获取的字典中查找出记录网址后缀的键值对
2.不推荐使用连续的多个if判断
3.针对面条版的代码首先应该考虑封装成函数
def index(request):
return 'index'
def login(request):
return 'login'
def register(request):
return 'register'
def error(request):
return '404 error'
urls = (
('/index', index),
('/login', login),
('/register', register),
)
根据py文件中功能的不同划分到不同的py文件(模块化)
urls.py 存储对应关系
views.py 存储功能函数
start.py 存储启动文件
templates文件夹 存储html文件
# 以后要想新增功能,只需要在urls.py中添加对应关系,view.py中编写函数
动静态网页
静态网页
静态网页就是页面上的数据直接写死的,要想改变只能修改源码。
动态网页
动态网页就是页面上的数据不是全部写死的,有些是动态获取(后端传入)。eg:1.页面上展示当前时间(后端获取传递给前端界面); 2.页面上展示数据库数据(后端链接数据库查询数据再传递给页面)。
实际需求
后端代码回去当前时间 然后让前端页面展示
1.字符串替换
2.将字典数据传递给html页面并且想要在页面上操作字典数据
我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据
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()
# 3.思考:如何给字符串添加一些额外的字符串数据>>>:字符串替换
new_data = data.replace('asdaksdjal',c_time)
return new_data
jinja2模板语法
jinjia2模块能够让我们在html文件内使用类似于后端的语法来操作各种数据类型。
下载:在cmd命令窗口输入'pip3 install jinja2'下载第三方模块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 %}
<!--作用:获取数据库中的数据展示到前端页面-->
框架请求流程
urls.py
后缀与函数名对应关系
('/index',register)
后缀专业名词称之为'路由'
函数名专业名词称之为'视图函数'
urls.py专业名词称之为'路由层'
views.py
专门编写业务逻辑代码
可以是函数 也可以是类
函数专业名词称之为'视图函数'
类专业名词称之为'视图类'
views.py专业名词称之为'视图层'
templates文件夹
专门存储html文件
html文件专业名词称之为'模板文件'
templates文件夹专业名词称之为'模板层'
models.py
存储与数据库表相关的类
models.py专业名词称之为'模型层'
python主流web框架
框架 | 说明 | 缺陷 |
---|---|---|
django | 大而全 自身携带的功能非常的多 类似于航空母舰 | 开发小项目的时候使用该框架有点笨重(大材小用) |
flask | 小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块 | 受限于第三方模块的开发 |
tornado | 异步非阻塞 该框架快到可以作为游戏服务器 | 上手难度是三者最高的 |
fastapi,sanic | 最近流行的 抽空可以看看 |
框架虽然多,但是内部逻辑大差不差,我们重点学习一个即可>>>:django,如果你是小白切记不要同时学习上述框架
django框架简介
版本问题
1.X:同步 1.11
2.X:同步 2.2
3.X:异步 3.2
ps:我们学习的时候,可以基于django2.2.22版本学习,与1.X功能几乎一致。3.X仅仅是多了一个功能
下载
在cmd窗口输入'pip3 install django==2.2.22'(用版本2.2.22为例子)。如果之前下载了其他版本不用管,自动替换!
启动注意事项
1.计算机名称尽量不要有中文
2.项目中所有的py文件名尽量不要用中文
3.不同版本的python解释器配合不同版本的django会有一些报错,找到报错信息提示的那一行代码,把逗号删除即可
4.一个pycharm窗口只允许有一个项目,不要做项目的嵌套
验证django是否下载成功
cmd终端输入django-admin有反应就是成功了。
django基本操作命令
命令行操作
1.创建django项目
django-admin startproject 项目名
2.启动django项目
1.先切换到项目目录下
cd 项目名
2.执行启动目录
python38 manage.py runserver ip:port
"""
在启动django项目的时候 一定要确保一个端口只有一个项目
"""
3.访问django服务端
浏览器直接访问
4.创建app应用
"""
django框架类似于是一个空壳子,给你提供所需的资源,至于到底要写哪些功能,需要通过app来划分
eg:django初始项目可以看成是一所大学,app就相当于是大学里面的各个学院
"""
python38 manage.py startapp 应用名
pycharm操作django
1.创建django项目
2.创建更多的app
pycharm左上角tools,选择run manage.py task。
startapp app名称
3.启动项目
直接点击pycharm右上方的绿色箭头启动即可
命令行与pycharm操作的区别
1.命令行不会自动创建templates文件夹
2.命令行不会在配置文件编写关于templates文件夹配置
'DIRS':[os.path.join(BASE_DIR,'templates')]
3.pycharm自动创建的第一个应用会自动注册到配置文件中
4.针对db.sqlite3文件不用去在乎它有没有创建,只要运行了django会自动出来
django目录结构
django项目目录
项目同名文件夹
__init__.py 很少用,主要做一些冷门配置
settings.py 项目配置文件
urls.py 对应关系(目前简单理解:网址名后缀跟函数名)
wsgi.py django服务,基本不用
应用名文件夹(可以有多个)
migrations文件夹 orm相关(数据库打交道的记录)
__init__.py 很少用,主要做一些冷门配置
admin.py django自带的后台管理
apps.py 创建应用之后用于应用的注册
models.py 存储与数据库表相关的类
tests.py 自带的测试文件
view.py 存储业务相关的逻辑代码(函数,类)
manage.py django入口文件
templates文件夹 存储项目所需的html文件
db.sqlite3 自带的小型数据库
创建应用之后 一定要去配置文件中注册才能生效
完整语法:'app01.apps.App01Config'
简写语法:'app01'
django小白必会三板斧
启动django项目之后如何添加更多的功能?通过之前直接编写的web框架,我们可以知道添加更多的功能可以去编写urls.py和views.py。
django自带重启功能。当识别到项目中代码有变化之后隔段时间会自动重启,但是有时候较慢。
与浏览器打交道的视图函数都应该有返回值,常见的就是下列三个。
HttpResponse
主要用于返回字符串类型的数据
render
主要用于返回html页面,并且支持模板语法(django自己写的)
redirect
主要用于页面重定向,括号内可以写其他网站的全称,也可以写自己网站的后缀
案例:
def index(request):
return HttpResponse('你好啊 django的学习可容不得半点马虎!!!')
return render(request, 'index.html',{'name':'jason'})
return redirect('https://www.sogo.com')
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库