基础知识点
动静态网页
1.静态网页:页面数据均为写死的 不是动态获取 修改只能修改源代码
2.动态网页;页面数据是从后端动态获取 修改方便 更改对应后端数据代码即可
jinja2模板语法
1.jinja2模板是第三方模块:可以在前端页面html文件中如使用后端的语法一样操作数据(运用于前后端结合)
2.模块导入:from jinja2 import Template
temp = Template(data)
3.html页面操作{{data.get('name')}} {{data.['name']}} {{data.name}}
python主流框架
1.django框架:大而全
2.flask框架:小而精
3.tornndo框架:异步非阻塞
4.fastapi框架
5.sanic框架
django框架
django下载
pip install django-2.22
django安装
1.1.x版本基于pymysql
2.x及以上版本
django项目创建
django-admin manage.py startproject 项目名
django项目启动
python manage.py runserver ip:port(不写ip与端口默认本机)
命令行操作django
创建app:python manage.py startapp app名
配置文件中配置templates文件夹及路径
配置文件中配置app
pycharm操作django
创建 选择django 添加app
settings配置文件中检查app创建 templates文件夹路径 static静态文件配置及创建
django返回前端页面数据方式(三板斧)
1.render:返回前端页面或者字典等数据
2.HttpResponse:返回字符串(JsonResponse-json格式字符串)
3.redirect:重定向(用于页面切换 如需要购买商品添加购物车 页面跳转至登录页面)
pycharm连接数据库(MySQL)
首次连接需要下载驱动
django连接数据库(MySQL)
1.默认数据库sqlite3
2.在settings配置文件中配置mysql基本数据信息(如库名、用户名、密码、ip、端口) 需要下载第三方模块pymysqlclient
django生命周期流程图
路由层
django路由匹配
1.path转换器:路由后面还需要添加别的数据(转换器匹配到的内容会当做函数关键字参数传入)
1.1 种类:5种
'int': TntConverter(),
'str':StringConverter()
2.re_path转换器(正则匹配):路由后面的数据一旦匹配上就会执行后面的函数(^匹配开头,$限制结尾)
2.1 正则表达式无名分组
(\d+)/(.*?) 正则表达式加括号是分组的意思 第一个是数字 第二个都可以 将正则表达式以位置参数传给函数
2.2 正则表达式有名分组
(?P<year>\d+)/(?P<other>.*?)正则表达式加括号是分组的意思 第一个是数字 第二个都可以 ?P起名 将正则表达式以关键字参数传给函数
3.版本区别:
1.x url正则匹配
2.x以上版本 path/re_path re_path == url
反向解析
反向解析
1.反向解析:解析出一个结果 刚好可以匹配上路由(防止当写好路由匹配后 页面已经多出运用该路由 导致修改路由而使网址点击失效)
1.1 运用:起别名方式 path('func/', views.func, name="func_view")
1.2 html页面语法:{% url 'func_view' %}
1.3 views后端语法:def fun(request, '123', 'ash123n') redirect('func_view')重定向/reverse('func_view') 可以解析网址后缀(真实路由数据)
re_path url操作一致
2.有名无名分组:针对转换器后面还有不确定的数据
2.1 无名解析:
re_path(func/(\d+)/ views.func, name="func_view")
html页面语法:{% url 'func_view' '123' %} 必须要给出具体的值 根据业务不同写 如用户的话 可以是用户名
views后端语法:def fun(request, '123') reverse('func_view' args='123')
2.2 有名解析:
path(func/<str:info>)
re_path(func/(?P<year>\d+))
html页面语法:{% url 'func_view' '123' %} 必须要给出具体的值 根据业务不同写 如用户的话 可以是用户名
views后端语法:def fun(request, '123') reverse('func_view' args='123')
路由分发
1.路由分发:统筹管理 方便开发 django可以让每个app拥有独立的路由文件、静态文件文件、templates文件夹
2.总路由:path('app01/', include('app01.urls'))
path('app02/', include('app02.urls'))
3.分路由:path('func/', views.func)
path('func/', views.func)
注:项目庞大 应用过多使用
名称空间
1.当不同app反向解析时起的别名一致时 反向解析 时无法自动识别是那个应用的 reverse('func_view')
path('func/', views.func, name='func_view')
path('func/', views.func, name='func_view')
注:起别名同一个项目不应该重复
方式一:路由分发时
总路由:path('app01/', include(('app01.urls', 'app01'), namespance='app01'))
path('app02/', include(('app02.urls','app02'),namespance='app02'))
方式二:别名不冲突
path('func/', views.func, name='app01_func_view')
path('func/', views.func, name='app02_func_view')
网页伪静态
1.网页伪静态:欺骗浏览器将动态网页伪装成静态网页 增加浏览器收录概率 提高被搜索及查询展示的概率
2.方式:网址后缀以文件后缀结尾
视图层
视图函数返回值
1.视图函数的返回值必须是一个HttpResponse对象
HttpRwsponse、render、redirect都继承了HttpResponse返回值都是HttpResponse对象
2.视图函数返回json格式字符串
2.1 通过json模块 json.dumps(数据)/存在中文(json.dumps(数据,ensure_Ascii=False))
2.2 通过django提供的JsonResponse(继承的也是HttpResponse) JsonResponse(数据)/存在中文
JsonResponse(数据, json_dumps_params={'ensure_Ascii': False})
注:查看源码得到JsonResponse里有个参数json_dumps_params时默认值参数 为空
在实参中**json_dumps_params(**可以将数据打散成关键字参数) 所以给它传输中文解码
2.2.1 当JsonResponse序列化的不是字典数据时 需要添加safe参数=False
注:JsonResponse主要是为了序列化字典数据
1.请求类型:form表单默认是GET请求 通过修改method修改请求类型
GTE请求:向别人索求数据
POST请求:给别人提供数据
if request.method == 'POST':
2.form表单携带文件数据
2.1 html页面:
请求类型必须是method="post"
属性enctype="multipart/form-data"
2.2 后端:
request.POST 普通数据
request.FILES 文件数据
注:可以通过文件的写入将文件数据保存至后端
request对象方法
1.POST请求
1.request.method 获取请求类型
2.request.POST 获取用户提供的数据(form表单已经要提供name属性才可以将数据传递到后端 字典类型)
3.request.POST.get() 获取列表中最后一个数据
4.request.POST.getlist() 获取整个列表数据
2.GET请求
1.request.GET 获取url后面的数据(网址后缀后面?携带的非敏感数据、?后面的数据是不参与路由匹配的)
2.request.GET.get() 获取列表中最后一个数据
3.request.GET.getlist() 获取整个列表数据
ORM操作数据库数据
1.查询数据:导入models文件(from app01 import models)
models.类名.object.filter(字段=值, 字段=值)
sql语句:select * from where(字段=值, 字段=值)
查看sql原生语句:查询结果.query
fist拿第一个对象数据
注:从前端用户输入获取的数据是字符串(判断错误时需要注意该点)
2.增数据:
models.类名.object.create(字段=值)
3.改数据:
models.类名.object.filter(筛选条件).update(字段=值)
4.删数据:
models.类名.object.filter(删选条件).delect()
5.orm外键关联
一对一:查询次数高 models.OneToOneField(to=关联表)
一对多:多的一方 models.ForeignKey(to=关联表名, on_delete=models.CASCADE(级联删除))1.1版本不用加 2以上版本需要加
多对多:查询多的一方(自动产生第三张表) models.ManyToManyField(to=关联表名)
FBV与CBV
1.FBV:基于函数的视图
def func(request):
return HttpResponse('FBV视图')
路由匹配:path('func/', views.func)
2.CBV:基于类的视图
from django import views
class MyView(views.View):
def get(self, requese):
return HttpResponse('CBV视图中的get方法')
def post(self, request):
return HttpResponse('CBV视图中的post方法')
路由匹配:path('index/', views.MyView.as_view())
3.区别:FBV需要通过request.method=='POST'判断请求类型执行函数
CBV可以自动识别请求类型 执行不同的请求数据(查看源码)
模板层
1.请求类型:form表单默认是GET请求 通过修改method修改请求类型
GTE请求:向别人索求数据
POST请求:给别人提供数据
if request.method == 'POST':
2.form表单携带文件数据
2.1 html页面:
请求类型必须是method="post"
属性enctype="multipart/form-data"
2.2 后端:
request.POST 普通数据
request.FILES 文件数据
注:可以通过文件的写入将文件数据保存至后端
模板语法
模板语法之传值
1.传值方式
1.指明道姓的传值:
return render(request, 'func.html', {'name'=name})
2.一次性传值:
return render(request, 'func.html', locals())
3.区别:根据不同情况采用不同的方法
指明道姓适用于少量传值
一次性传值适用于批量传值
2.传值类型
2.1 基本数据类型:都可以传值 针对容器类型的数据可以通过点的方式获取(如字典可以点k值 所有容器类型也可以通过点索引获取)
2.2 函数名:自动加括号调用将返回值返回到前端页面 如果没有返回值则返回None
2.3 类名:自动加括号实例化产生对象 将对象数据返回到前端页面
2.4 对象:将对象数据返回到前端页面
注:判断数据是否能加括号调用 能则直接加括号调用
模板语法之过滤器
类似于内置函数
模板语法之标签
类似于流程控制
注:需要数据{{}}
逻辑{}
自定义相关功能
1.自定义标签
2.自定义过滤器
3.自定义inclusion
注:创建templatetags文件夹中创建py文件
from django.template import Library
register = Library()
模板的继承与导入
1.模板继承:使用某个模板大多数样式 对其中的一部分样式做更改
在父模板中对需要修改的部分用{% block content %}模板内容 {% endblock %} 进行包裹
注:最好有三个修改部分 如区域 js css
在子页面删除所有格式{% extends 'home.html' %}继承 {% block content %} 子板内容 {% endblock %}
2.模板的导入:将html页面当模块导入(局部页面)对页面上某个部分进行导入使用
{% include 'func.html'} 注:func.html是个局部页面
模型层
ORM操作
ORM
1.ORM:对象关系映射
类 表
对象 记录
对象属性 字段对应的值
2.位置:应用下models.py文件
3.创建表:
class User(models.Model):
id = models.AutoField(primary_key=True) create table user(id primary key atto_increment)
name = models.CharField(max_length=32) 原生sql语句:create table user(name varchar(32))
4.执行数据库迁移命令:产生的表会在表名前面加app名当前缀 防止多个app之间表名冲突 只要表的字段发生改变都需要执行数据库迁移命令
记录:python manage.py makemigrations
在数据库中创表:python manage.py migrate
注:可以通过tools 进行数据库迁移命令简写
id主键可以不写 orm会自动添加一个id主键(如果主键名不想要id 只能自己创建)
关键字
普通关键字
1.create()
类加括号实例化 save()保存
2.
双下滑线关键字
1.比较运算符
__gt
__lt
__gte
__lte
2.成员运算符
__in
3.范围查询(数字)
__range(顾头顾尾)
4.模糊查询
__contains 不忽略大小写
__icontains 忽略大小写
5.日期查询
__year
__mouth
__day
底层SQL查看方式
1.方式一:如果结果是Queryset对象(直接点query查看)
2.方式二:通过日志模块代码查看
ORM创建外键
1.一对一:models.OneToOneField(to=关联表 on_delete)
2.一对多: models.ForeignKey()
3.多对多:三种方式
方式一:查询频率高的一方 ORM会自动创建第三张表 models.ManyToManyField()
方式二:自己创建第三张表
方式三:自己创建第三张表 通过ORM建立关系关联
外键字段的数据添加
1.一对一:
方式一:实际字段添加关联值
方式二:通过获得对象添加
2.一对多:
方式一:实际字段添加关联值
方式二:通过获得对象添加
3.多对多:
方式一:对象点外键字段
方式二:查询对象点对象
注:第三张表操作:添加 add() 括号中数据值或者对象
删除 remove() 括号中数据值或者对象
修改 set(可迭代对象) 括号中迭代对象
清空 clean() 括号中不需要添加数据
正反向查询
1.正向查询:存在外键字段的表数据查询没有外键字段的表数据
2.反向查询:没有外键字段的表数据查询其余有关联的表
注:正向查询按外键字段 反向查询按表名小写(多个数据表名小写_set.all())
跨表查询
基于对象
1.基于对象查询(相当于子查询)
基于双下划线
1.基于双下划线查询(相当于连表查询 注:inner join left join right join)
values指定查询字段
聚合查询
1.聚合函数:max min count avg sum(需要导入)
2.聚合查询关键字:aggregate(未分组必须要使用关键字 分组不需要)
分组查询
1.分组查询关键字:annotate()
2.filter分组前相当于where 分组后相当于having
F查询
1.F查询涉及查询字段都来源于表中字段非固定数据
注:当表中已存在数据时添加数据字段
设置字段值允许为空 null=True
设置字段默认值 default=0
在终端中直接选择给出默认值(1) 1 provide a default value
Q查询
Q可以改变filter内多个条件之间的逻辑关系
, and关系 | or关系 ~ not关系
ORM查询优化
1.查询优化:减少数据库的查询(django orm默认是惰性查询 真正需要时才会执行代码)
2.方法:
2.1 only与defer(会将括号内填写的字段封装成一个个数据对象)
only:对象在点击括号中出现的字段 不会再走数据库查询
对象点括号内没有的字段时 每次都会走数据库查询
defer:数据对象点击括号中出现的字段 每次都会走数据库查询
对象点击括号内不存在的字段 不会走数据库查询
2.2 select_related与prefetch_related
select_related:括号内只能接受外键字段(一对一 一对多)自动连表
数据对象点击表中数据的时候不会走数据库查询
prefetch_related:底层是子查询 将查询之后的结果一次性封装到数据对象中
ORM常见字段及字段参数
事务相关
事务:ACID
事务隔离级别:脏读 幻读 不可重复读 ...
原生SQL: start transaction\rollback\commit\savepoint
多对多创建方式
Ajax操作
1.Ajax:js自带的功能(学习的是jQuery封装之后的版本)
2.Ajax与form表单的区别
Ajax:异步提交 局部刷新
form表单:同步提交 涉及整个页面
3.基础语法
$.ajax({
url:'',
type:'post',
data:{},
success:function (args) {
$('#d3').val(args)
}
})
数据编码格式
1.数据编码格式
1.1格式一:urlencoded
数据格式:name=lili&age=18
django后端统一将数据放到request.POST中
1.2.格式二:formdata
数据格式:无法查看(二进制格式)
django后端自动将文件数据处理到request.FILES 普通数据request.POST
1.3.格式三:application/json
数据格式:json(form表单无法操作)
django后端不会处理 在request.body中存储(bytes类型) 所有的数据开始都会放在body中
语法注意事项:data:JSON.stringify({'name':'lili'}) 编码
contentType:'application/json'
Ajax携带文件操作
回调函数参数
1.回调函数:
后端与ajax交互 通常情况下返回json格式数据
前端针对HttpResponse和JsonResponse返回的json格式数据处理策略不同
HttpResponse不会自动反序列化
1.需要我们自己操作json.loads(json_bytes)
2.也可以添加固定参数:dataType:'JSON'
JsonResponse会自动反序列化
sweetalter简介
1.插件操作:可以设置二次确认的动态框样式 可以从bootstrap中查找样式
django自带序列化组件
批量数据操作
1.1 通过create添加
产生数据后持续性向数据库添加数据 容易导致数据库崩掉(数据过多不适用)
1.2 通过bulk_create添加/bulk_update修改
先产生所有数据 一次性添加至数据库(适用于批量数据处理)
分页器
from app01.plugins import mypage
book_query = models.Book.objects.all()
page_obj = mypage.Pagination(current_page=request.GET.get('page'),
all_count=book_query.count()
)
page_query = book_query[page_obj.start:page_obj.end]
return render(request, 'bookList.html', locals())
{% for book_obj in page_query %}
<p class="text-center">{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}
1.数据校验:支持提前设置各种校验规则 之后自动校验
2.渲染页面:支持直接渲染获取用户数据的各种标签
3.展示信息:支持针对不同的校验失败展示不同的提示
4.用户信息校验:
1.数据校验功能
1.1 传递待校验的数据:
1.2 判断所有数据是否符合校验:form_obj.is_valid()
1.3 获取符合校验规则的数据:form_obj.cleaned_data
1.4 查询不符合校验规则的数据及错误原因:form_obj.errors
1.1 封装程度高 扩展性差
{{ form_obj.as_p }}
{{ form_obj.as_table }}
{{ form_obj.as_ul }}
1.2 封装程度低 扩展性好 编写困难
{{ form_obj.name.label }}
{{ form_obj.name }}
1.3 封装程度低 扩展性好
{% for form in form_obj %}
<p>{{ form.label }}{{ form }}</p>
{% endfor %}
注:类以外的标签不会被自动渲染 需要自己编写
1.展示信息:通过form表单取消浏览器自动添加的数据校验功能
1.局部钩子:校验单个字段 需要返回单个字段
2.全局钩子:检验多个字段 需要返回全部字段
在面向对象中封装特性里变量名前加括号是告诉我们不要直接访问(隐藏)
涉及内容:面向对象 反射判断是否存在该属性与获取该属性
modelform组件是form组件的优化版本
cookie与session
1.Cookie简介
1.1.Cookie的由来:
由于请求是基于HTTP协议(四大特性 基于请求响应 基于TCP、IP协议作用于应用层之上 无状态 无连接)
所以对于服务器来说 每一次的请求都是全新的 但是实际应用中需要保存产生的数据 需要"保存状态"
1.2.Cookie:具体指的是一段小信息 它是服务器发送出来存储在浏览器上的一组组键值对 下次访问服务器 浏览器会自带这些信息 以便服务器提取有用信息
1.3.Cookie原理:由服务器产生内容 浏览器收到请求后保存本地 当浏览器再次访问时 浏览器会自动带上Cookie 这样服务器就可以通过Cookie的内容判断是谁
2.Session简介
2.1 Session的由来:由于Cookie以文本的形式保存在本地 自身安全性较差 且保存的字节数有限制(最大是4096字节) 所以针对私密信息及超过4096字节的文本数据可以通过Session保存在服务器上
django操作cookie与session
1.djabgo操作cookie
1.获取Cookie
request.COOKIES['key']
request.get_cookie(key,default=RAISE_ERROR, salt='', max_age=None)
参数:default 默认值
salt 加密盐
max_age 后台控制过期时间
2.设置Cookie
2.1 让客户端浏览器保存cookie需要HttpResponse对象调用方法
return HttpResponse()
return rander()
return redirect()
return JsonReponse()
2.2 设置cookie(需要变形)
obj = HttpResponse()
obj.操作cookie的方法(2.1的方法)
return obj
obj = render()
obj.操作cookie的方法
return obj
obj = redirect()
obj.操作cookie的方法
return obj
2.django操作session
1.获取session:session依赖于cookie cookie保存至浏览器上 session保存至服务器端
request.session['key']
django默认的session失效时间是14天
客户端会接收到键值对 键默认是sessionid值是加密的随机字符串(令牌)
request.session['name'] = 'lili'
django自动产生一个随机字符串返回给客户端(对name加密)
往django_session创建数据(对lili加密)
自动从请求中获取sessionid对应的随机字符串(request.session.get('name') 获取)
用随机字符串去django_session中匹配数据 匹配上自动解密并展示
2.session的存储位置
2.1 数据库Session
2.2 缓存session
2.3 文件session
2.4 缓存+数据库
2.5 加密cookie session
3.session的其他操作
3.1 删除当前会话的所有Session数据
request.session.delect()
3.2 删除当前的会话数据并删除会话的Cookie
request.session.flush()
3.3 设置会话Session与Cookie的超时时间
request.session.set_expiry(value)
如果value是个整数 session会在秒数后失效
如果value是datatime或timedelta,session就会在这个时间后失效
如果value是0,用户关闭浏览器session就会失效
如果value是None,session会依赖全局session失效
中间件
中间件简介
1.中间件:所有的请求和响应都必须经过 中间件
2.django默认自带七个中间件 每个中间件都有各自的职责和功能
3.中间件设置:除了默认的之外 还可以自定义中间件(没有数量限制)
4.应用场景:全局相关功能
全局用户身份校验
全局用户黑名单校验
全局用户访问频率校验(爬虫场景)
5.django自定义中间件五个方法:
process_request
process_response
process_view
process_template_response
process_exception
中间件操作方法
1.自定义中间件:
settings中在中间件配置中配置
路由中进行路由匹配
创建一个py文件进行中间件创建(模仿)
2.process_request方法
2.1 请求来的时候会按照配置文件中注册的中间件 从上往下依次执行每一个中间件里的process_request方法 没有则跳过
2.2 该方法如果返回HttpResponse对象 那么请求不会再往后执行 直接原路返回
3.process_response方法
3.1 响应走的时候会按照配置文件中注册的中间件 从下往上一次执行每一个中间件里的process_response方法 没有则跳过
3.2 该方法有两个形参request和response 并且默认情况下应该返回response
3.3 该方法也可以返回HttpResponse对象
注:如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别的process_request方法返回(flask不同)
4.process_view方法
当路由匹配成功之后 执行视图函数之前 自动触发
5.process_excption方法
当视图函数报错之后 自动触发
6.process_template_response方法
当视图函数返回的数据对象中含有render属性对应的render函数才会触发
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库