当前位置: 首页 > news >正文

Django框架学习

文章目录

        • Django框架
          • 项目开发
            • 1. 创建项目
            • 2. 项目目录结构
            • 3. 视图函数(view)
            • 4. 路由配置url
            • 5. HTTP请求
            • 6. HTTP响应 - 状态吗
            • 7. GET方式传参
            • 8. POST传递参数
          • 模板Templates
            • 1. 通过 loader 获取模板,通过HttpResponse进行响应
            • 2. 使用 render() 直接加载并响应模板
          • Django模板语言
            • 1. 模板的传惨
            • 2. 模板的变量
            • 3. 模板的标签
            • 4. 过滤器
            • 5. 模板的继承
          • Django中的应用app
            • 1. 创建应用app
            • 2. 应用的分布式路由
          • 数据库和模型
            • 1. mysql数据库的配置
            • 2. 模型(Models)
            • 3. ORM框架
            • 4. 示例
            • 5. 字段类型
            • 6. 字段选项
          • 数据库的基本操作
            • 1. 管理器对象
            • 2. 新增数据
            • 3. 查询数据(table_name.objects.查询接口)
            • 4. 修改数据
            • 5. 删除数据
          • admin后天数据管理
          • cookies和session
            • cookies
            • session 会话控制
          • 缓存
            • 1. 数据库缓存
            • 2. 文件系统缓存
            • 3. 本地内存缓存
            • 4. Django中使用缓存
          • 中间件 Middleware
            • 1. 中间件类
            • 2. 编写中间件类
            • 3. 注册中间件
          • 跨站请求伪造保护 CSRF

Django框架

一个重量级的python web框架,Django配备了常用的大部分组建

MVC设计模式:模型层/视图层/控制层

  • 基本配置
  • 路由系统
  • 原生HTML模板系统
  • 视图view
  • Model模型,数据库连接和ORM数据库管理
  • 中间件
  • Cookie & Seesion
  • 分页
  • 数据库后台管理系统admin
项目开发
1. 创建项目
django-admin startproject myproject
2. 项目目录结构
myproject/
|- manage.py
|- myproject|- __init.py__|- settings.py|- urls.py|- wsgi.py
  1. manage.py:项目的主程序
    • python3 manage.py runserver 启动服务
    • python3 manage.py startapp 创建应用
    • python3 manage.py migrate 数据库迁移
  2. myproject:项目包文件夹
    • __init__.py:包初始化文件
    • wigs.py:WEB服务网关接口的配置文件,仅部署项目时使用
    • urls.py:项目的基础路由配置文件
    • settings.py:Django的配置文件,启动服务时自动调用
3. 视图函数(view)

视图函数是用于接受一个浏览器请求并通过HttpResponse对象返回数据的函数。

# file : <项目名>/views.py
from django.http import HttpResponse
def page1_view(request):html = "<h1>这是第1个页面</h1>"return HttpResponse(html)
4. 路由配置url
  • settings.py中的ROOT_URLCONF指定了主路由配置列表urlpatterns的文件位置

    ROOT_URLCONF = 'dadashop.urls'
    
  • urls.py主路由配置文件

    urlpatterns是一个路由-视图函数映射关系的列表,此列表的映射关系由url函数来确定

    主路由配置文件可以不处理用户具体路由,即做路由的分发(分布式请求处理),具体的请求由各自的应用来进行处理。

    from django.conf.urls import url, include
    from django.contrib import adminurlpatterns = [url(r'^admin', admin.site.urls),url(r'^v1/users', include('user.urls')),url(r'^person/(?P<name>\w+)/(?P<age>\d{1,2})',views.person_view)
    ]
    
  • url()函数

    用于描述路由与视图函数的对应关系

    from django.conf.urls import url, include

    url(regex, views, name=None)

    • regex:字符串类型,匹配的请求路径,允许是正则表达式
    • view:指定路径所对应的视图处理函数的名称
    • name:为地址起别名,在模板中地址反向解析时使用
  • 带有分组的路由和视图函数

    在视图函数中,可以用正则表达式分组 () 提取参数后用函数位置传参传递给视图函数

    一个分组表示一个参数,多个参数需要使用多个分组,并且使用个/隔开

  • 带有命名分组的路由和视图函数

    在url 的正则表达式中可以使用命名分组(捕获分组)

    在视图函数内,可以用正则表达式分组 (?P<name>pattern) 提取参数后用函数关键字传参传递给视图函数

    url(r'^person/(?P<name>\w+)/(?P<age>\d{1,2})',views.person_view)
    
  • url反向解析

    url反向解析是指在视图或模板中,用为url定义的名称来查找或计算出响应的路由

    url(regex, views, kwargs=None, name=“别名”)

5. HTTP请求
  • HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法(最常用)

  • HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

  • HttpRequest对象

6. HTTP响应 - 状态吗
  • Django中的响应对象HttpResponse

    HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
    
    • content_type响应体数据类型:
      • 'text/html'(默认的,html文件)
      • 'text/plain'(纯文本)
      • 'text/css'(css文件)
      • 'text/javascript'(js文件)
      • 'multipart/form-data'(文件提交)
      • 'application/json'(json传输)
      • 'application/xml'(xml文件)
7. GET方式传参
  • 通过查询字符串将数据传递给服务器

    URL格式:xxx?name1=value1&name2=value2
    
  • 服务器端接受数据

    1. 判断request.method的值判断请求方法是否是get请求

      if request.method == 'GET'处理GET请求时的业务逻辑
      else:处理其它请求的业务逻辑
      
    2. 获取客户端GET请求提交的数据

      request.GET['参数名']
      request.GET.get['参数名', '默认值']
      request.GET.getlist('参数名')
      
8. POST传递参数
  • 客户端通过表单等POST请求将数据传递给服务器端

  • 服务器端接受数据

    1. 判断request.method的值判断请求方法是否是POST请求

      if request.method == 'POST'处理POST请求时的业务逻辑
      else:处理其它请求的业务逻辑
      
    2. 使用post方式接收客户端数据

      request.POST['参数名']
      request.POST.get['参数名', '默认值']
      request.POST.getlist('参数名')
      
模板Templates

模板是可以根据字典数据动态变化的html网页

模板可以根据视图中传递的字典数据动态生成相应的HTML网页。

1. 通过 loader 获取模板,通过HttpResponse进行响应
from django.template import loader
# 1.通过loader加载模板
t = loader.get_template("模板文件名")
# 2.将t转换成 HTML 字符串
html = t.render(字典数据)
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)
2. 使用 render() 直接加载并响应模板
from django.shortcuts import render
return render(request,'模板文件名', 字典数据)
Django模板语言
1. 模板的传惨
2. 模板的变量
3. 模板的标签
4. 过滤器
5. 模板的继承
Django中的应用app
1. 创建应用app
python3 manage.py startapp app_name
  • django应用的结构组成

    1. migrations 文件夹

      保存数据迁移的中间文件

    2. __init__.py

      应用子包的初始化文件

    3. admin.py

      应用的后台管理配置文件

    4. apps.py

      应用的属性配置文件

    5. models.py

      与数据库相关的模型映射类文件

    6. tests.py

      应用的单元测试文件

    7. views.py

      定义视图处理函数的文件

  • 配置安装应用

    settings.py 中配置应用, 让此应用能和整个项目融为一体

    # file : settings.py 
    INSTALLED_APPS = [... ...,'app_name'
    ]
    
2. 应用的分布式路由
  • include函数

    # urls.py主路由配置文件from django.conf.urls import url, include
    from django.contrib import admin# include('app命字.url模块名')
    urlpatterns = [url(r'^admin', admin.site.urls),url(r'^v1/users', include('user.urls'))
    ]
    
  • 应用中的路由urls.py配置文件

    from django.conf.urls import url
    from . import viewsurlpatterns = [url(r'^$', views.Class_name.as_view()),
    ]
    
数据库和模型
1. mysql数据库的配置
  1. 安装pymysql:用作Python和mysql的接口

  2. 创建数据库:create database 数据库名 default charset utf8 ;

  3. setting.py中的mysql相关配置

    DATABASES = {'default' : {'ENGINE': 'django.db.backends.mysql','NAME': 'mywebdb',  # 数据库名称,需要自己定义'USER': 'root','PASSWORD': '123456',  # 管理员密码'HOST': '127.0.0.1','PORT': 3306,}
    }
    
2. 模型(Models)
  • 模型是一个Python类,它是由django.db.models.Model派生出的子类
  • 一个模型类代表数据库中的一张数据表
  • 模型类中每一个类属性都代表数据库中的一个字段
  • 模型是数据交互的接口,是表示和操作数据库的方法和方式
3. ORM框架

ORM(Object Relational Mapping)即对象关系映射。它是一种程序技术,允许使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库。

  • 作用:

    1. 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库;
    2. 根据设计的模型类生成数据库中的表格;
    3. 通过简单的配置就可以进行数据库的切换
  • 优点:

    1. 只需要面向对象编程,不需要面向数据库编写代码

      对数据库的操作都转化成对类属性和方法的操作;

      不用编写各种数据库的sql语句;

    2. 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异

      不在关注用的是mysql/oracle…等数据库的内部细节;

      通过简单的配置就可以轻松更换数据库,不需要修改代码

  • 缺点:相比直接使用SQL语句操作数据库,性能上有损失

4. 示例
  1. 新建app

    python3 manage.py startapp bookstore
    
  2. models.py中添加模型类

    # file : bookstore/models.py
    from django.db import models# Create your models here.
    class Book(models.Model):title = models.CharField("书名",max_length=50,default='', unique=True)#00000.00price = models.DecimalField("定价", max_digits=7,decimal_places=2, default=0.0)#新添字段时,记住加default值pub = models.CharField('出版社', max_length=200, default='')market_price = models.DecimalField('零售价', max_digits=7, decimal_places=2, default=0.0)class Mata:db_table = "Book_massage" # 自定义数据库表名def __str__(self):return '%s_%s_%s_%s'%(self.title,self.price,self.pub,self.market_price)
    
  3. 在setting.py中注册app

    # file : setting.py
    INSTALLED_APPS = [...'bookstore',
    ]
    
  4. 数据库迁移

    迁移是Django同步你对模型所做的更改(添加字段、删除模型等)到数据库的方式

    • 生成或更新迁移文件

      在每个应用下的models.py文件生成一个中间文件

      python3 manage.py makemigrations
      
    • 执行迁移脚本程序

      目的是将每个应用下的migrations.py目录中的中间文件同步到数据库

      python3 manage.py migrate
      
5. 字段类型
  1. BooleanField()

    • 数据库类型:tinyint(1)
    • 编程语言中:使用True或False来表示值
    • 在数据库中:使用1或0来表示具体的值
  2. CharField()

    • 数据库类型:varchar
    • 注意:
      • 必须要指定max_length参数值
  3. DateField()

    • 数据库类型:date
    • 作用:表示日期
    • 编程语言中:使用字符串来表示具体值
    • 参数:
      • DateField.auto_now: 每次保存对象时,自动设置该字段为当前时间(取值:True/False)。
      • DateField.auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)。
      • DateField.default: 设置当前时间(取值:字符串格式时间如: ‘2019-6-1’)。
      • 以上三个参数只能多选一
  4. DateTimeField()

    • 数据库类型:datetime(6)
    • 作用:表示日期和时间
    • auto_now_add=True
  5. DecimalField()

    • 数据库类型:decimal(x,y)

    • 编程语言中:使用小数表示该列的值

    • 在数据库中:使用小数

    • 参数:

      • DecimalField.max_digits: 位数总数,包括小数点后的位数。 该值必须大于等于decimal_places.
      • DecimalField.decimal_places: 小数点后的数字数量
    • 示例:

      money=models.DecimalField(max_digits=7,decimal_places=2,default=0.0
      )
      
  6. FloatField()

    • 数据库类型:double
    • 编程语言中和数据库中都使用小数表示值
  7. EmailField()

    • 数据库类型:varchar
    • 编程语言和数据库中使用字符串
  8. IntegerField()

    • 数据库类型:int
    • 编程语言和数据库中使用整数
  9. URLField()

    • 数据库类型:varchar(200)
    • 编程语言和数据库中使用字符串
  10. ImageField()

  • 数据库类型:varchar(100)
  • 作用:在数据库中为了保存图片的路径
  • 编程语言和数据库中使用字符串
  • 示例:
    image=models.ImageField(upload_to="static/images"
    )
    
  • upload_to:指定图片的上传路径
    在后台上传时会自动的将文件保存在指定的目录下
  1. TextField()
    • 数据库类型:longtext
    • 作用:表示不定长的字符数据
6. 字段选项

指定创建的列的额外的信息;允许出现多个字段选项,用,隔开。

  1. primary_key
    • 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数库表不会创建id字段
  2. blank
    • 设置为True时,字段可以为空。设置为False时,字段是必须填写的。
  3. null
    • 如果设置为True,表示该列值允许为空。
    • 默认为False,如果此选项为False建议加入default选项来设置默认值
  4. default
    • 设置所在列的默认值,如果字段选项null=False建议添加此项
  5. db_index
    • 如果设置为True,表示为该列增加索引
  6. unique
    • 如果设置为True,表示该字段在数据库中的值必须是唯一(不能重复出现的)
  7. db_column
    • 指定列的名称,如果不指定的话则采用属性名作为列名
  8. verbose_name
    • 设置此字段在admin界面上的显示名称。
  • 示例:
    # 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
    name = models.CharField(max_length=30, unique=True, null=False, db_index=True)
    
数据库的基本操作

数据库的基本操作包括增删改查操作

1. 管理器对象

每个继承子models.Model的模型类,都会有一个objects对象被同样继承下来,即管理器对象。

作用是实现数据库的增删改查操作

2. 新增数据

创建数据中每一条记录就是创建一个数据对象

  1. MyModel.objects.create(属性1=值1, 属性2=值1,…)
  2. 创建 MyModel 实例对象,并调用 save() 进行保存
obj = MyModel(属性=,属性=)
obj.属性=值
obj.save()
3. 查询数据(table_name.objects.查询接口)
  • 查询接口

    说明方法
    查询全部记录,返回QuerySet查询对象all()
    查询符合条件的单一记录get(条件判断)
    查询符合条件的多条记录filter()
    查询符合条件之外的全部记录exclude():排除
  • all()方法:MyModel.objects.all()

    查询MyModel实体中所有的数据,返回QuerySet容器对象,内部存放 MyModel 实例

    等同于:select * from table

    from bookstore import modelsbooks = models.Book.objects.all()
    for book in books:print("书名", book.title, '出版社:', book.pub)
    
  • get()方法:MyModel.objects.get(条件)

    返回满足条件的唯一一条数据,返回MyModel对象

    from bookstore import models
    book = models.Book.objects.get(id=1)print(book.title)
    
  • filter()方法:MyModel.objects.filter(字段__条件)

    1. __exact : 等值匹配 exact(准确的、精确的)

      Author.objects.filter(id__exact=1)
      # 等同于select * from author where id = 1
      
    2. __contains : 包含指定值

      Author.objects.filter(name__contains='w')
      # 等同于 select * from author where name like '%w%'
      
    3. __startswith : 以 XXX 开始

    4. __endswith : 以 XXX 结束

    5. __gt : 大于指定值

      Author.objects.filer(age__gt=50)
      # 等同于 select * from author where age > 50
      
    6. __gte : 大于等于

    7. __lt : 小于

    8. __lte : 小于等于

    9. __in : 查找数据是否在指定范围内

      Author.objects.filter(country__in=['中国','日本','韩国'])
      # 等同于 select * from author where country in ('中国','日本','韩国')
      
    10. __range: 查找数据是否在指定的区间范围内

    # 查找年龄在某一区间内的所有作者
    Author.objects.filter(age__range=(35,50))
    # 等同于 SELECT ... WHERE Author BETWEEN 35 and 50;
    
  • exclude()方法:MyModel.objects.exclude(条件)

    返回不包含此 条件 的 全部的数据集

    books = models.Book.objects.exclude(pub="清华大学出版社", price__gt=50)
    for book in books:print(book)
    
4. 修改数据
  1. 修改单个实体的某个字段值的步骤

    1. 查:通过get()得到要修改的实体对象
    2. 改:通过对象.属性 的方式修改数据
    3. 保存:通过对象.save() 保存数据
    from bookstore import models
    abook = models.Book.objects.get(id=10)
    abook.market_price = "10.5"
    abook.save()
    
  2. 通过QuerySet批量修改对应的全部字段(MyModel.update(属性=值))

    直接调用QuerySet的update(属性=值) 实现批量修改

    # 将 id大于3的所有图书价格定为0元
    from bookstore import models
    books = models.Book.objects.filter(id__gt=3)
    books.update(price=0)
    # 将所有书的零售价定为100元
    books = Book.objects.all()
    books.update(market_price=100)
    
5. 删除数据

删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法

  1. 删除单个对象

    • 查找查询结果对应的一个数据对象
    • 调用这个数据对象的delete()方法实现删除
    from bookstore import models
    book = models.Book.objects.get(id=1)
    book.delete()
    
  2. 删除查询结果集

    • 查找查询的结果集中满足条件的全部QuerySet查询集合对象
    • 调用查询集合对象的delete()方法实现删除
    # 删除全部作者中,年龄大于65的全部信息
    auths = Author.objects.filter(age__gt=65)
    auths.delete()
    
admin后天数据管理

django会收集所有已注册的模型类,为这些模型类提供管理界面供开发者使用

  1. 创建后台管理账号

    python3 manage.py createsuperuser
    
  2. 用注册的账号登录后台管理界面

    • 在终端启动django服务:python3 manage.py runserver 127.0.0.1:8000
    • 后台管理的登录地址:http://127.0.0.1:8000/admin
cookies和session
cookies
  • cookies是保存在客户端浏览器上的存储空间,通常用来记录浏览器端自己的信息和当前连接的确认信息

  • cookies在浏览器上是以键-值对的形式进行存储,键和值都是以ASCII字符串的形式存储

  • cookies内部的数据会在每次访问此网址时都会携带到服务器端

  • 在Django服务器端来设置浏览器的cookies必须通过HttpResponse对象来完成

  • 添加、修改COOKIE

    HttpRespone.set_cookie(key, value='', max_age=None, expires=None)
    
    • key: cookie的名字
    • value: cookie的值
    • max_age: cookie存活时间,秒为单位
    • expires: 具体过期时间
    • 当不指定max_age和expires时,关闭浏览器时此数据失效
  • 删除COOKIE

    # HttpResponse.delete_cookie(key)responds = HttpResponse("已删除 my_var1")
    responds.delete_cookie('my_var1')
    
  • django中的对象

    1. 使用相应对象HttpRsponse将cookie保存到客户端
    from django.http import HttpResponse
    resp = HttpResponse()
    resp.set_cookie('cookies名', cookies值, 超期时间)
    
    1. 使用render对象将cookie保存到客户端
    from django.shortcuts import render
    resp = render(request,'xxx.html',locals())
    resp.set_cookie('cookies名', cookies值, 超期时间)
    
    1. 获取cookie

      # 通过 request.COOKIES 绑定的字典(dict) 获取客户端的 COOKIES数据
      value = request.COOKIES.get('cookies名', '没有值!')
      print("cookies名 = ", value)
      
session 会话控制
  • 是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据

  • session的作用

    • http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
    • 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
    • 推荐使用sesison方式,因为所有数据存储在服务器端,数据更加安全
  • session的实现

    • 使用 session 需要在浏览器客户端启动 cookie,且用在cookie中存储sessionid
    • 每个客户端都可以在服务器端有一个独立的Session
  • 在django的settings.py中配置Session

    • 向 INSTALLED_APPS 列表中添加:

      INSTALLED_APPS = [# 启用 sessions 应用'django.contrib.sessions',
      ]
      
    • 向 MIDDLEWARE 列表中添加:

      MIDDLEWARE = [# 启用 Session 中间件'django.contrib.sessions.middleware.SessionMiddleware',
      ]
      
    • SESSION_COOKIE_AGE

      作用: 指定sessionid在cookies中的保存时长(默认是2周),如下:

      SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2

    • SESSION_EXPIRE_AT_BROWSER_CLOSE = True

      设置只要浏览器关闭时,session就失效(默认为False)

    • 当使用session时需要迁移数据库,否则会出现错误

      $ python3 manage.py makemigrations
      $ python3 manage.py migrate
      
缓存

Django中提供多种缓存方式,如需使用需要在settings.py中进行配置

1. 数据库缓存

Django可以将其缓存的数据存储在您的数据库中

  • settings.py

    CACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache','LOCATION': 'my_cache_table','TIMEOUT': 300,  #缓存保存时间 单位秒,默认值为300, 'OPTIONS':{'MAX_ENTRIES': 300, #缓存最大数据条数'CULL_FREQUENCY': 2,#缓存条数达到最大值时 删除1/x的缓存数据}}
    }
    
  • view.py

    from django.views.decorators.cache import cache_page@cache_page(30)
    def test_cache(request):# time.sleep(3)t1 = time.time()return HttpResponse('t1 is %s'%(t1))# return render(request, 'test_cache.html', locals())
    
  • 床架你缓存表

    python3 manage.py createcachetable
    
2. 文件系统缓存
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': '/var/tmp/django_cache',#这个是文件夹的路径#'LOCATION': 'c:\test\cache',#windows下示例}
}
3. 本地内存缓存
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake'}
}
4. Django中使用缓存
  1. 在视图view中使用cache

     from django.views.decorators.cache import cache_page@cache_page(30)  -> 单位s
    def my_view(request):...
    
  2. 在路由中使用

    from django.views.decorators.cache import cache_pageurlpatterns = [path('foo/', cache_page(60)(my_view)),
    ]
    
  3. 在模板中使用

    {% load cache %}
    {% cache 500 sidebar request.user.username %}.. sidebar for logged in user ..
    {% endcache %}
    
中间件 Middleware

中间件是 Django 请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变 Django 的输入或输出。

每个中间件组件负责做一些特定的功能。

1. 中间件类
  • 中间件类须继承自 django.utils.deprecation.MiddlewareMixin
  • 中间件类须实现下列五个方法中的一个或多个:
    • def process_request(self, request): 执行路由之前被调用,在每个请求上调用,返回None或HttpResponse对象
    • def process_view(self, request, callback, callback_args, callback_kwargs): 调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
    • def process_response(self, request, response): 所有响应返回浏览器 被调用,在每个请求上调用,返回HttpResponse对象
    • def process_exception(self, request, exception): 当处理过程中抛出异常时调用,返回一个HttpResponse对象
    • def process_template_response(self, request, response): 在视图函数执行完毕且试图返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象
  • 注: 中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponese对象时表示此请求结束,直接返回给客户端
2. 编写中间件类
# file : middleware/mymiddleware.py
from django.http import HttpResponse, Http404
from django.utils.deprecation import MiddlewareMixinclass MyMiddleWare(MiddlewareMixin):def process_request(self, request):print("中间件方法 process_request 被调用")def process_view(self, request, callback, callback_args, callback_kwargs):print("中间件方法 process_view 被调用")def process_response(self, request, response):print("中间件方法 process_response 被调用")return responsedef process_exception(self, request, exception):print("中间件方法 process_exception 被调用")def process_template_response(self, request, response):print("中间件方法 process_template_response 被调用")return response
3. 注册中间件
# file : settings.py
MIDDLEWARE = [...]
跨站请求伪造保护 CSRF
  • 跨站请求伪造攻击

    某些恶意网站上包含链接、表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站请求伪造(CSRF,即Cross-Site Request Forgey)。

  • CSRF中间件模板标签提供对跨站请求伪造简单易用的防护。

  • CSRF的作用:不让其它表单提交到此Django服务器

  • 解决方案

    1. 取消csrf验证

      删除 settings.py 中 MIDDLEWARE 中的 django.middleware.csrf.CsrfViewMiddleware 的中间件

    2. 通过验证csrf_token验证

      需要在表单中增加一个标签:

      {% csrf_token %}

相关文章:

Django框架学习

文章目录Django框架项目开发1. 创建项目2. 项目目录结构3. 视图函数&#xff08;view&#xff09;4. 路由配置url5. HTTP请求6. HTTP响应 - 状态吗7. GET方式传参8. POST传递参数模板Templates1. 通过 loader 获取模板,通过HttpResponse进行响应2. 使用 render() 直接加载并响应…...

JavaSE21-集合1-set

文章目录一、集合概念二、set集合1、set集合的特点2、HashSet2.1 特点2.2 创建对象2.3 常用方法2.4 遍历2.4.1 foreach遍历2.4.2 使用迭代器遍历2.4.3 转换为数组遍历一、集合概念 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说&#xff0c;集合的长度可变会…...

Web版和客户端哪种SQL工具更好?ChatGPT有话要说

2023年年初公司发布了一款Web版SQL工具&#xff0c;短期内就赢得了众多用户的喜爱和下载。不过&#xff0c;也有SQL用户在评论区中提出自己的观点&#xff0c;认为Web版工具都不可靠&#xff0c;甚至看见Web版工具就劝返… … 工具Web化逐渐成为一种趋势&#xff0c;比如&…...

从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制

如何确保IM 不丢消息是个相对复杂的话题&#xff0c;从客户端发送数据到服务器&#xff0c;再从服务器抵达目标客户端&#xff0c;最终在 UI 成功展示&#xff0c;其间涉及的环节很多&#xff0c;这里只取其中一环「接收端如何确保消息不丢失」来探讨&#xff0c;粗略聊下我接触…...

2023年java春招面试题及答案

2023年java春招面试题1、下面有关jdbc statement的说法错误的是&#xff1f;2、下面有关JVM内存&#xff0c;说法错误的是&#xff1f;3、下面有关servlet service描述错误的是&#xff1f;4、下面有关servlet和cgi的描述&#xff0c;说法错误的是&#xff1f;5、下面有关SPRIN…...

Django学习——基础篇(上)

一、Django的安装 pip install djangopython目录下出现两个文件 djando-admin.exe django django-admin.exe django 二、创建项目 1.命令行&#xff08;终端&#xff09; 1.打开终端 winR 输入cmd 2.进入项目目录 3.执行命令创建项目 2.Pycharm 两种方法对比 1.命令行创…...

研报精选230302

目录 【个股230302华西证券_比亚迪】系列点评五十四&#xff1a;迪“王”需求向上 出口“海”阔天空【个股230302华西证券_华利集团】下游去库存背景下承压&#xff0c;毛利率保持稳健【个股230302开源证券_恒顺醋业】公司信息更新报告&#xff1a;四季度业绩承压&#xff0c;期…...

Unity心得

- 将结果与因子颠倒的函数Mathf.InverseLerp非常实用 - at 10 meters, you want volume 1 - at 20 meters, you want volume 0 - volume InvLerp( 20, 10, distance ) - 显示HideFlags为Hide类型的物体 Resources .FindObjectsOf…...

TryHackMe-Binex

Binex 枚举计算机并获取交互式 shell。利用 SUID 位文件&#xff0c;使用 GNU 调试器利用缓冲区溢出并通过 PATH 操作获得根访问权限。 端口扫描 循例 nmap SMB枚举 题目给了提示&#xff1a;Hint 1: RID range 1000-1003 Hint 2: The longest username has the unsecure pa…...

外贸人如何写出优秀的开发信?附详细思路

如何写出优秀的开发信&#xff1f;最近做出口生意的客户都在抱怨&#xff0c;开发信的回复率越来越低&#xff0c;其实原因有很多&#xff0c;有时候并非自己的能力实在很欠缺。原因总结如图&#xff1a;第一&#xff1a;市场不景气这个就是就属于客观因素了&#xff0c;这也许…...

python自学之《21天学通Python》(18)——第21章 案例2 Python搞定大数据

“大数据&#xff08;Big Data&#xff09;”这个术语最早期的引用可追溯到apache org的开源项目Nutch。当时&#xff0c;大数据用来描述为更新网络搜索索引需要同时进行批量处理或分析的大量数据集。随着谷歌MapReduce和GoogleFileSystem &#xff08;GFS&#xff09;的发布&a…...

面试问题【数据库】

数据库数据库的三范式是什么drop、delete、truncate 分别在什么场景之下使用char 和 varchar 的区别是什么数据库的乐观锁和悲观锁是什么SQL 约束有哪几种mysql 的内连接、左连接、右连接有什么区别MyIASM和Innodb两种引擎所使用的索引的数据结构是什么mysql 有关权限的表都有哪…...

Allegro如何输出钻孔表操作指导

Allegro如何输出钻孔表操作指导 用Allegro做PCB设计的时候,需要输出钻孔表格,用于生产加工,如下图 如何输出钻孔表,具体操作如下 点击Manufacture点击NC...

消息队列 面试题 整理

消息队列 为什么要使用消息队列&#xff1f; 异步解耦&#xff1a;关注的是通知而非处理。 流量削峰&#xff1a;将短时间内高并发的请求持久化&#xff0c;然后逐步处理&#xff0c;削平高峰期的请求。 日志收集&#xff1a; 事务最终一致性 系统间的消息通信方式&#xff…...

【Java】对象比较大小

在Java中经常会涉及到对象数组的排序问题&#xff0c;那么就涉及到对象之间的比较问题。Java实现对象排序的方式有两种&#xff1a; 自然排序&#xff1a;java.lang.Comparable定制排序&#xff1a;java.util.Comparator 规则&#xff1a;需要我们自定义根据对象的某个或某些属…...

发票自动OCR识别并录入模板 3分钟免费配置

要问整个公司里和数据打交道最多的职能&#xff0c;非财务莫属了吧。除了每天要处理大量财务数据外&#xff0c;还有发票录入的工作让财务陷入“易燃易爆炸”的工作状态。发票报销看似简单&#xff0c;但发票的类型有很多种&#xff0c;每种发票需要录入的信息也有差别。再加上…...

Dubbo 配置说明

dubbo:scan:base-packages: com.ut.msdasw.services.appservice //这个会扫描该包下得全部接口protocol: //这个主要是配置传输的协议和端口&#xff0c;只是一个协议name: dubbo port: 30032registry: //这里是服务注册中心的地址address: spring-cloud://localhost consum…...

英飞凌TCxxx实战系列01_Alarm处理

目录 1.概述2. Alarm内部处理2.1关联的寄存器2.2 Alarm设置case3. SMU外部处理3.1 关联的寄存器4. WDT Alarm的特殊处理4.1 看门狗超时测试4.2 RecoveryTimer相关的Alarm1.概述 当MCU运行出现问题,如MCU温度过高、过低,看门狗超时等会触发一个Alarm,当SMU收到Alarm信号后,…...

飞桨全量支持业内AI科学计算工具——DeepXDE!

AI技术在跨学科融合创新方面扮演着日益重要的角色&#xff0c;特别是在Al for Science领域&#xff0c;AI技术的发展为跨学科、跨领域的融合创新带来了巨大的机会。AI已成为一个关键的研究工具&#xff0c;改变了基础科学的研究范式。依托AI技术开发的科学计算工具&#xff0c;…...

【c++基础】

C基础入门统一初始化输入输出输入输出符输入字符串const与指针c和c中const的区别const与指针的关系常变量与指针同类型指针赋值的兼容规则引用引用的特点const引用作为形参替换指针其他引用形式引用和指针的区别inline函数缺省参数函数重载判断函数重载的规则名字粉碎C编译时函…...

语音识别技术对比分析

文章目录一、语音识别产品对比二、百度语音识别产品1、套餐及价格&#xff1a;2、官网3、调研结果三、华为语音识别产品四、阿里云语音识别产品1、套餐及价格&#xff1a;2、官网地址3、调研结果五、科大讯飞语音识别产品1、套餐及价格&#xff1a;2、官网3、调研结果六、有道语…...

Idea git 回滚远程仓库版本

目标 回滚远程仓库到特定版本。 将【添加test03】版本回滚到【行为型模式】版本。 回滚前的效果图 步骤 ①复制需要回滚到的版本的版本号 ②右键项目&#xff0c;选择Git-Repository-Reset Head ③Reset Type选择Hard&#xff1b;To Commit填入步骤①复制的版本号&#xff…...

vscode C++配置

program&#xff1a;调试入口文件的地址cwd&#xff1a;程序启动调试的目录miDebuggerPath&#xff1a;调试器的路径launch.json// { // // Use IntelliSense to learn about possible attributes. // // Hover to view descriptions of existing attributes. // /…...

【微电网_储能】基于启发式状态机策略和线性程序策略优化方法的微电网中的储能研究【给定系统约束和定价的情况下】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

rk3288-android8-IR-mouse

IR问题: mouse按键使用不了 然后排查: 1.排查上报 ir_key6{ rockchip,usercode <0xbf00>;rockchip,key_table <0xff KEY_POWER>,<0xfe KEY_MUTE>, <0xfd KEY_1>, <0xfc KEY_2>, <0xfb KEY_3>, <0xfa KEY_4>, <0xf9 KEY_5>…...

2023-03-01干活小计

昨天组会&#xff0c;元气大伤&#xff0c;拖更直接。今天继续&#xff0c;三月加油&#xff01; python魔术方法&#xff1a; __repr__:print()时候调用&#xff0c;注意函数返回值就是打印值。 __len__:len()时候调用 __call__:实例()时候调用 __getitem__:self[i]时候调…...

客户服务软件推荐榜:28款!

在这个竞争激烈的时代&#xff0c;做到服务对企业的存亡有着深刻的意义。改善客户服务&#xff0c;做好客户服务工作&#xff0c;是关键&#xff0c;因为客户服务团队代表着企业的形象&#xff0c;面孔&#xff0c;客户有可能 不大会记得企业的某个东西&#xff0c;但是他们将会…...

Spring注入和注解实现IOC

标题注入依赖注入的方式通过Set方法注入通过构造方法注入自动注入依赖注入的数据类型注入Bean对象注入基本数据类型和字符串注入List注入Set注入Map注入Properties注解实现IOCComponentRepository、Service、Controller注入 依赖注入的方式 在使用依赖注入时&#xff0c;如果…...

Python统计Labelme标注文件信息并绘制散点图

Python统计Labelme标注文件信息并绘制散点图前言前提条件相关介绍实验环境Python统计Labelme标注文件信息并绘制散点图前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击…...

远程接入方案 OpenText Exceed TurboX(ETX) 客户案例——ET Innovations

远程接入方案 OpenText Exceed TurboX&#xff08;ETX) 客户案例——ET Innovations ET Innovations GmbH 助力奥地利各地的医疗保健专业人员提升患者体验 医疗保健信息系统开发商利用 OpenText™ Exceed™ TurboX 将远程访问其软件的稳定性提高了 95% 公司&#xff1a;ET I…...

国内单页面网站/企业查询

token详解前言什么是token&#xff1f;为什么要使用token&#xff1f;那么如何使用token呢&#xff1f;使用Token进行身份验证和授权的过程具体步骤项目上如何运用的tokentoken过期了什么办&#xff1f;总结升华前言 本篇博客主要从什么是token&#xff1f;为什么要使用token&…...

武汉 网站 合作伙伴/爱站网ip反域名查询

日常使用PHP开发较多&#xff0c;但是有些地方PHP的语言的瓶颈就显露出来了&#xff0c;例如&#xff0c;同样是抓取一个网站的内容&#xff0c;使用PHP需要较为复杂的正则匹配&#xff0c;效率较为低下。python具有丰富的类库&#xff0c;拿过来直接可以使用&#xff0c;功能强…...

网站推广有哪些优势/百度关键词推广公司

得流量者得天下&#xff0c;有了流量&#xff0c;客户和生意才会跟着来&#xff0c;所以流量的获取一直都是市场部门的核心目标之一。这几年&#xff0c;SEO的重要性一点都没衰减&#xff0c;甚至有很多小型的创业公司&#xff0c;也会给专门的HC来提升SEO效果。 在基础的SEO工…...

网站正在建设页面/各种推广平台

本节课演示PresentationMode和模态窗口的使用,实现点击模态窗口里的指定视图,以关闭模态窗口。 定义了一个遵循View协议的结构体,作为需要打开的模态窗口。 正如本章第7节所说,PresentationMode拥有一个isPresented属性和dismiss方法,所以我们可以借助它,轻松的实现模态…...

重庆 机械有限公司 江北网站建设/企业网站的主要类型有

对于淘宝店铺来说&#xff0c;淘宝客服是非常重要的岗位&#xff0c;他们每天都需要处理很多的问题&#xff0c;接待很多的消费者&#xff0c;对于商家来说&#xff0c;你知道自己的店铺如何去添加客服吗&#xff1f;接下来的内容进行相关介绍。 一、淘宝店如何添加客服? 商家…...

新西兰做网站代购/湖南中高风险地区

题目描述 兄弟俩骑车郊游&#xff0c;弟弟先出发&#xff0c;每分钟X米&#xff0c;M分钟后&#xff0c;哥哥带一条狗出发。以每分钟Y米的速度去追弟弟&#xff0c;而狗则以每分钟Z米的速度向弟弟跑去&#xff0c;追上弟弟后又立即返回&#xff0c;直到哥哥追上弟弟时&#xff…...