基础知识点

动静态网页

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')   # app01
  path('func/', views.func, name='func_view')   # app02
注:起别名同一个项目不应该重复
   方式一:路由分发时
    总路由:path('app01/', include(('app01.urls', 'app01'), namespance='app01'))
		   path('app02/', include(('app02.urls','app02'),namespance='app02'))
  方式二:别名不冲突
		path('func/', views.func, name='app01_func_view')   # app01
  		path('func/', views.func, name='app02_func_view')   # app02

网页伪静态

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主要是为了序列化字典数据

form表单携带数据

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可以自动识别请求类型 执行不同的请求数据(查看源码)

模板层

form表单携带数据

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:'',           # 控制数据提交的地址 相当于form表单中的action
                type:'post',      # 控制请求方式(默认是get请求) 相当于form表单中的method
                data:{},          # 组织提交的数据
                success:function (args) {     # success异步回调函数(函数返回什么就传入什么)
                    $('#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 }}

form组件

form组件简介

1.数据校验:支持提前设置各种校验规则 之后自动校验
2.渲染页面:支持直接渲染获取用户数据的各种标签
3.展示信息:支持针对不同的校验失败展示不同的提示
4.用户信息校验:

form组件校验数据

1.数据校验功能
1.1 传递待校验的数据:
1.2 判断所有数据是否符合校验:form_obj.is_valid()
1.3 获取符合校验规则的数据:form_obj.cleaned_data
1.4 查询不符合校验规则的数据及错误原因:form_obj.errors

form组件渲染标签

 1.1 封装程度高 扩展性差
    {{ form_obj.as_p }}      # 产生p标签及input框 分行展示
    {{ form_obj.as_table }}  # 产生input框 一行展示
    {{ form_obj.as_ul }}     # 产生input框 产生列表表示(无序列表)
 1.2 封装程度低 扩展性好 编写困难
	{{ form_obj.name.label }}  # 产生所点字段名大写
     {{ form_obj.name }}        # 产生input框
 1.3 封装程度低 扩展性好
	{% for form in form_obj %}        # for循环展示所有数据字段
        <p>{{ form.label }}{{ form }}</p>    # 产生所有数据字段名大写   产生input框
    {% endfor %}
注:类以外的标签不会被自动渲染 需要自己编写

form组件展示数据

1.展示信息:通过form表单取消浏览器自动添加的数据校验功能

form组件常见字段参数

form组件钩子函数

1.局部钩子:校验单个字段  需要返回单个字段
2.全局钩子:检验多个字段  需要返回全部字段

form组件源代码

在面向对象中封装特性里变量名前加括号是告诉我们不要直接访问(隐藏)
涉及内容:面向对象 反射判断是否存在该属性与获取该属性

modelform组件

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函数才会触发
 posted on   拾荒菇凉  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示