Django相关知识点回顾(二)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: Django相关知识点回顾(二)

9.状态保持COOKIE和SESSION

9.1cookie

9.1.1特点

1.cookie数据保存在客户端,以key-value存储。

2.cookie有过期时间,默认是关闭浏览器过期。

3.cookie是基于域名安全的,浏览器在访问一个服务器的时候,只会把跟这个服务器相关的cookie发送过去。

9.1.2设置

flask

1. response = make_response('响应内容')
2. response.set_cookie('<key>','<value>',max_age='<过期时间:s>')
django:
response = HttpResponse('响应内容')
response.set_cookie('<key>','<value>',max_age='<过期时间:s>')

9.1.3获取

flask:

request.cookies.get('<key>')

django:

request.COOKIES.get('<key>')

9.1.4删除

flask和django中操作一样

response.delete_cookie('<key>')

9.2session

9.2.1特点

1.session数据保存在服务器,以key-value方式存储。

2.session依赖于cookie,每个客户端的session信息标识保存在客户端的cookie中。

3.session也有过期时间,flask开启session过期时间之后默认30天,Django中的session过期时间默认2周。

9.2.2设置

flask:

from flask import session
session['<key>'] = '<value>'

django:

request.session['<key>'] = '<value>'

9.2.3获取

flask:

session.get('<get>')

django:

request.session.get('<key>')

9.2.4Django中session

1.关系数据库(默认存储方式:django_session)

SESSION_ENGINE='django.contrib.sessions.backends.db'

2.缓存(Django框架缓存默认是服务器内存

SESSION_ENGINE='django.contrib.sessions.backends.cache'

3.混合存储

  1. SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

4.将session信息存储到redis中

需要安装扩展:

pip install django-redis

然后再配置中进行设置

# 设置Django框架的缓存位置(如果不做设置,缓存默认是服务器内存)
# 此处是要把Django框架的缓存改为redis
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # redis数据库地址设置
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
# 设置将django框架的session存储到缓存中,上面已经把django的缓存改为了redis,所以session就存储到了redis中
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 设置session存储到缓存空间的名称
SESSION_CACHE_ALIAS = "default"


以上内容详细介绍请看文章『我是个链接



10.类视图

10.1使用

10.1.1定义类视图

# /register/
class RegisterView(View):
    """第一个类视图"""
    def get(self, request):
        return HttpResponse('返回注册页面')
    def post(self, request):
        return HttpResponse('进行注册处理')
    def put(self, request):
        return HttpResponse('put方法被调用')

10.1.2进行url配置

urlpatterns = [
    url(r'^register/$', views.RegisterView.as_view()),
]

10.2添加装饰器

1.直接在url配置时手动调用装饰器函数来实现装饰器添加

urlpattern = [
    url(r'^demo/$', my_cecorate(DemoView.as_view()))
]

2.使用Django框架提供的method_decorator,将针对函数视图装饰器,添加到类视图的方法上面。

# 为全部请求方法添加装饰器
@method_decorator(my_decorator,name='dispatch')
class DemoView(View):
    ...
# 为特定的请求方法添加装饰器
@method_decorator(my_decorator,name='get')
class DemoView(View):
    def get(self, request):
        ...
    ...

11.中间件

中间件是全局的

11.1定义中间件

def simple_middleware(get_response):
    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
    def middleware(request):
        # 此处编写的代码会在每个请求处理视图前被调用。
        response = get_response(request)
        # 此处编写的代码会在每个请求处理视图之后被调用。
        return response
    return middleware

11.2配置文件

MIDDLEWARE中注册中间件

11.3多个中间件代码执行顺序

init部分代码和中间件的注册顺序相反;

before_request部分代码和中间件的注册顺序相同

after_request部分代码和中间件的注册顺序相反

以上内容详细介绍请看文章『我是个链接


12.模板

12.1作用

渲染产生html页面内容,进行数据展示

12.2使用

flask

render_template('模板文件名',<key>=<value>,...)

django

1.设置模板目录:

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 此处修改
        ...
    },
]

2.使用:

render(requeest,'模板文件名',<字典>)

实例:

# /use_template/
class TemplateView(View):
    def get(self, request):
    # 使用模板
    return render(request, 'temp.html', {'content':'hello'})

12.3使用模板详细步骤

1.加载模板:指定使用模板文件,获取模板对象。

from django.template import loader
temp = loader.get_template('模板文件名')

2.模板渲染:给模板文件传递变量,将模板文件中的变量进行替换,获取替换之后的html内容。

res_html = temp.render(字典)

3.创建相应对象。

return HttpResponse(res_html)

13.数据库

13.1ORM框架

作用:将模型类和数据表进行对应,通过面向对象的方式进行数据库的操作。

flask:SQLAlchemy

django:自带ORM框架,可以直接进行使用

13.2Django和Flask模板区别

13.2.1模板变量

{{ 模板变量 }}

a) Django使用模板变量时,无论是字典、列表或者元组的元素,都需要使用 .取值,下标或者键名,不能使用 [],这是和Flask有区别的地方。

b) Django中的模板变量不能直接进行算术运算。

13.2.2模板控制语句

13.2.2.1条件判断

a) Django模板在进行条件判断时,比较操作符两边必须有空格。

13.2.2.2for循环

b) Django模板中的for循环和jinja2模板中for循环对比。

# Jinja2模板中for循环
{% for ... in ... %}
    # 遍历不为空时的逻辑
    # 获取for循环遍历到了第几次
    {{ loop.index }}
{% else %}
    # 遍历为空时的逻辑
{% endfor %}
# Django模板中for循环
{% for ... in ... %}
    # 遍历不为空时的逻辑
    # 获取for循环遍历到了第几次
    {{ forloop.couter }}
{% empty %}
    # 遍历为空时的逻辑
{% endfor %}

13.2.3模板过滤器

a) Jinja2模板过滤器使用

{{ 模板变量|过滤器(参数...)}}

b) Django中模板过滤器的使用

{{ 模板变量|过滤器:参数 }}

注意:Django过滤器 :之后只能接收一个参数

13.3步骤

13.3.1数据库连接配置

flask

SQLAlCHEMY_DATABASE_URI='mysql://<username>:<password>@<host_ip>:<port>/<db>

django:

1.在settings.py进行配置

# 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST':'127.0.0.1', #  数据库服务器IP
        'PORT':3306, # 数据库服务器port
        'USER':'root', # 用户名
        'PASSWORD':'mysql', # 密码
        'NAME':'django_demo' # 数据库名
    }
}

2.安装pymysql

pip install pymysql

3.首次启动时需要在项目同名目录 __init__.py添加

import pymysql
pymysql.install_as_MySQLdb()

13.3.2定义模型类

flask中定义模型类:

db = SQLAlchemy(app)
class User(db.model):
    """模型类"""
    # 字段名 = db.Column(字段类型, 选项参数)
    ...
    __tablename__ = '<表名>'

django中定义模型类:

class 模型类名(models.Model):
    # 字段名 = models.字段类型(选项参数)
    ...
    class Meta:
        db_table = '<表名>'

定义外键属性:

# 表中外键字段名格式: <外键属性_id>
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE, verbose_name'图书')

13.3.3迁移生成数据表

fl

ask:
1. flask-migrate
2. python manage.py db init# 生成迁移文件夹
3. python manage.py db migrate # 生成迁移文件
4. python manage.py db upgrade # 迁移

django:

# 生成迁移文件
python manage.py makemigrations
# 迁移生成表
python manage.py migrate

13.3.4通过模型类和对象进行数据库操作(增删改查)

新增
创建模型类对象--->对象.save()

注意:添加HeroInfo时,可以给hbook赋值,也可以直接表中hbook_id赋值

或者:

模型类.objects.create(...)
修改
查询对象->修改对象属性->对象.save()

或者:

模型类.objects.filter(...).update(...)
删除
查询对象->对象.delete()

或者:

模型类.objects.filter(...).delete()
查询
模型类.objects.查询函数

查询相关函数

函数名称 参数 作用 返回值
all 查询模型类对应表格中的所有数据 QuerySet(查询集)
get 查询条件 查询满足条件一条且只能有一条数据 模型类对象,查不到会报错DoesNotExist
filter 查询条件 返回满足条件的所有数据 QuerySet(查询集)
exclude 查询条件 返回不满足条件的所有数据 QuerySet(查询集)
order_by 排序字段 对查询结果进行排序 QuerySet(查询集)
aggregate 聚合 查询时进行聚合操作 字典:{'属性名_聚合类小写':值}
count 返回查询结果的数目 数字

条件查询

对应get,filter,exclude参数中可以写查询条件

格式:属性名__条件名 = 值

可以写多个查询条件,默认是且的关系

F对象

用于查询时字段之间的比较

from django.db.models import F

Q对象

用于查询时条件之间的逻辑关系

from django.db.models import Q

&(与) |(或) ~(非)

聚合类

聚合类: from django.db.models import Count, Sum, Avg, Max, Min

使用aggregate()过滤器调用聚合函数

排序

排序默认是升序,降序在排序字段前加-

使用order_by

关联查询

1.查询和指定对象关联的数据

# 由1查多
一对象.多类名小写_set.all()
例:book.heroinfo_set.all()
# 由多查1
多对象.外键属性
例:hero.hbook

2.通过模型类进行关联查询

# 查图书(一)
一类.objects.get|filter(多类名__字段__条件=值)
例:books = BookInfo.objects.filter(heroinfo__hcomment__contains='八')
# 查英雄(多)
多类.objects.filter(外键属性__字段__条件=值)
例:heros = HeroInfo.objects.filter(hbook__bread__gt=30)

13.4QuerySet(查询集)

all,filter,exclude,order_by这4个函数返回的是查询集对象

特点

可以像list一样进行操作,可以遍历、取下标、进行切片,切片时下标不允许为负数。

注意:对于QuerySet类的对象,可以继续调用之前所讲任何一个查询函数。

例:查询id大于3的图书数量

1. BookInfo.objects.filter(id__gt=3).count()
exists:判断查询集中是否有数据

两大特性

惰性查询

只有在使用查询集中的数据时才会进行数据库真正查询操作。

查询结果的缓存

使用同一个查询集时,只有在第一次使用查询集时会进行数据库的查询操作,然后Django框架就会把查询的结果存起来,下一次再使用这个查询集时,使用的Django之前存储的结果。

以上内容详细介绍请看文章『我是个链接


14.Admin站点

Django自带文件存储系统,可以直接通过Admin站点进行图片的上传,默认上传的文件保存在服务器本地。

使用

1.在配置文件中设置配置项MEDIA_ROOT='上传文件的保存目录'

2.定义模型类时,图片字段的类型使用 ImageField

3.迁移生成表并在admin.py注册模型类,直接登录Admin站点就可以进行图片上传

以上内容详细介绍请看文章『我是个链接

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
存储 安全 数据库
关于“Python”Django 管理网站的核心知识点整理大全52
关于“Python”Django 管理网站的核心知识点整理大全52
19 0
|
8月前
|
JSON 关系型数据库 数据库
|
12月前
|
Python
Django知识点-URL路由 name=
Django知识点-URL路由 name=
48 0
|
存储 Web App开发 前端开发
Django知识点笔记(4)
Django知识点笔记(4)
Django知识点笔记(4)
|
SQL XML 缓存
Django知识点笔记(3)
Django知识点笔记(3)
Django知识点笔记(3)
|
SQL 数据可视化 前端开发
Django知识点笔记(2)
Django知识点笔记(2)
Django知识点笔记(2)
|
设计模式 JSON 前端开发
Django知识点笔记(1)
Django知识点笔记(1)
Django知识点笔记(1)
|
安全 中间件 开发者
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
284 0
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
|
索引 Python 数据安全/隐私保护
第16 17章节-Python3.5-Django知识点整理 15
知识点整理: 内容整理 1. 创建Django工程 django-admin startproject 工程名 2.
1144 0