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

pt26django教程

admin 后台数据库管理

django 提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用

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

创建后台管理帐号:

[root@vm mysite2]# python3 manage.py createsuperuser
/root/mysite2
用户名 (leave blank to use 'root'): tarena
电子邮件地址: 123456@qq.com
Password:[root@vm mysite2]#  mysql -uroot -p123456 -e 'select * from mysite2.auth_user\G'
*************************** 1. row ***************************id: 1password: pbkdf2_sha256$150000$yE0lYzKHcN9i$VShFRN+WFSWd4qOuZDdnEJIi0j0b3u2XHZMJMuQuPvQ=last_login: NULL
is_superuser: 1username: tarenafirst_name:last_name:email: 123456@qq.comis_staff: 1is_active: 1

后台管理的登录地址: http://127.0.0.1:8000/admin/ tarena 123456

Django提供了完善的后台管理功能,也是一个完善的用户权限管理模块。登录到后台,我们可以管理系统的提供的用户、组、权限等信息。也可以管理用户的模型类呢?例如:Book类。

注册自定义模型类

若要自己定义的模型类也能在 /admin 后台管理界中显示和管理,需要将自己的类注册到后台管理界面。添加自己定义模型类的后台管理数据表的,需要用admin.site.register(自定义模型类) 方法进行注册

在应用app中的admin.py中导入models类,并注册

[root@vm mysite2]# vim bookstore/admin.py
from django.contrib import admin# Register your models here.
from .models import Book  #导入
admin.site.register(Book)  #注册

使用预览(功能还不是很完善需改造)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改自定义模型类的展现样式

  • 在admin后台管理数据库中对自定义的数据记录都展示为 XXXX object 类型的记录,不便于阅读和判断
  • 在用户自定义的模型类中可以重写 def __str__(self): 方法解决显示问题,如:
    • 在 自定义模型类中重写 str(self) 方法返回显示文字内容:
    class Book(models.Model):...def __str__(self):return "书名" + self.title[root@vm mysite2]# cat bookstore/models.py
    from django.db import models# Create your models here.
    class Book(models.Model):title = models.CharField("书名", max_length=50, default='')price = models.DecimalField('定价', max_digits=7,decimal_places=2, default=0.0)# 新增属性/字段 (要有默认值)market_price = models.DecimalField("零售价", max_digits=5,decimal_places=2,default=0.0)pub = models.CharField("出版社", max_length=50,default="")def __str__(self):info = "书名: %s, 出版社: %s, 定价: %s" % (self.title, self.pub, self.price)return info

模型管理器类

  • 作用: 为后台管理界面添加便于操作的新功能。

  • 说明: 后台管理器类须继承自 django.contrib.admin 里的 ModelAdmin

模型管理器的使用方法:

<应用app>/admin.py 里定义模型管理器类

class XXXXManager(admin.ModelAdmin):......

绑定注册模型管理器和模型类

admin.site.register(YYYY, XXXXManager) # 绑定YYYY 模型类与管理器类XXXManager

示例:

# file : bookstore/admin.py
from django.contrib import admin
from .models import Bookclass BookManager(admin.ModelAdmin):list_display = ['id', 'title', 'price', 'market_price']admin.site.register(Book, BookManager)

进入http://127.0.0.1:8000/admin/bookstore/book/ 查看显示方式和以前有所不同
在这里插入图片描述

  • 模型管理器类ModelAdmin中实现的高级管理功能
    1. list_display 去控制哪些字段会显示在Admin 的修改列表页面中。
    2. list_display_links 可以控制list_display中的字段是否应该链接到对象的“更改”页面。
    3. list_filter 设置激活Admin 修改列表页面右侧栏中的过滤器
    4. search_fields 设置启用Admin 更改列表页面上的搜索框。
    5. list_editable 设置为模型上的字段名称列表,这将允许在更改列表页面上进行编辑。
    6. 其它参见https://docs.djangoproject.com/en/2.2/ref/contrib/admin/
# file : bookstore/admin.py
from django.contrib import admin
from .models import Bookclass BookManager(admin.ModelAdmin):list_display = ['id', 'title', 'price', 'market_price']ist_display_links =['id', 'title', 'price']list_filter = ['pub']search_fields = ['id','title']list_editable = []
admin.site.register(Book, BookManager)

再谈Meta类

模型类可以通过定义内部类class Meta 来重新定义当前模型类和数据表的一些属性信息,一般不建议使用

用法格式如下:

class Book(models.Model):title = CharField(....)class Meta:1. db_table = '数据表名'- 该模型所用的数据表的名称。(设置完成后需要立马更新同步数据库)2. verbose_name = '单数名'- 给模型对象的一个易于理解的名称(单数),用于显示在/admin管理界面中3. verbose_name_plural = '复数名'- 该对象复数形式的名称(复数),用于显示在/admin管理界面中...            class Meta:verbose_name = '图书' verbose_name_plural = '图书'
在后台/admin管理界面中 ,站点管理之前显示 books,现在显示图书          

数据表关联关系映射

#新建项目,初始化配置
[root@vm mysite5]# mysql -uroot -p123456 -e 'create database mysite5 default charset utf8;'
[root@vm ~]# django-admin startproject mysite5
[root@vm ~]# cd mysite5/
[root@vm mysite5]# vim mysite5/settings.pyALLOWED_HOSTS = ['*',]
DATABASES = {'default' : {'ENGINE': 'django.db.backends.mysql','NAME': 'mysite5','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': 3306,}
}LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = "Asia/Shanghai"[root@vm mysite5]# python3 manage.py runserver 0.0.0.0:8000

常用的表关联方式有三种:

  1. 一对一映射:如: 一个身份证对应一个人
  2. 一对多映射:如: 一个班级可以有多个学生
  3. 多对多映射:如: 一个学生可以报多个课程,一个课程可以有多个学生学习

一对一映射OneToOneField

语法

class A(model.Model):...
class B(model.Model):属性 = models.OneToOneField(A, on_delete=xxx)

外键类字段选项,特殊字段参数on_delete【必须项】:

models.CASCADE  级联删除。 Django模拟SQL约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象。models.PROTECT 抛出ProtectedError 以阻止被引用对象的删除;[等同于mysql默认的RESTRICT]models.SET_NULL 设置ForeignKey null;需要指定null=Truemodels.SET_DEFAULT  将ForeignKey设置为其默认值;必须设置ForeignKey的默认值。

其它参请参考文档 https://docs.djangoproject.com/en/2.2/ref/models/fields/#foreignkey

其余常用的字段选项【非必须项】;如: null , unique 等

用法示例

创建作家和作家妻子类

[root@vm mysite5]# python3 manage.py startapp oto
[root@vm mysite5]# vim mysite5/settings.py
INSTALLED_APPS = [
...'oto',[root@vm mysite5]# vim oto/models.pyfrom django.db import modelsclass Author(models.Model):'''作家模型类'''# 有一个反向属性,wife。下面会提到name = models.CharField('作家', max_length=50)class Wife(models.Model):'''作家妻子模型类'''name = models.CharField("妻子", max_length=50)author = models.OneToOneField(Author,on_delete=models.CASCADE)  # 增加一对一属性  author规范一下写法是关联Author类的小写 #CASCADE  将产生级联删除[root@vm mysite5]# python3 manage.py makemigrations
[root@vm mysite5]# python3 manage.py migrate
[root@vm mysite5]# mysql -uroot -p123456 -e 'desc mysite5.oto_author;'
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
[root@vm mysite5]# mysql -uroot -p123456 -e 'desc mysite5.oto_wife;'
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| name      | varchar(50) | NO   |     | NULL    |                |
| author_id | int(11)     | NO   | UNI | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

创建一对一的数据记录

使用对象关联或主键关联

[root@vm mysite5]# python3 manage.py shellfrom oto.models import *
author1 = Author.objects.create(name='王老师')
wife1 = Wife.objects.create(name='王夫人', author=author1)  # 对象关联王老师author2 = Author.objects.create(name='张老师')  # 主键关联的第二种方式
wife1 = Wife.objects.create(name='张夫人', author_id=author2.id)>>> author3 = Author.objects.create(name='小李老师') #创建无关联的数据,主表数据可以比从表多
> select * from oto_author;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | 王老师    |
|  2 | 张老师    |
|  3 | 小李老师  |
+----+-----------+
> select * from oto_wife;
+----+-----------+-----------+
| id | name      | author_id |
+----+-----------+-----------+
|  1 | 王夫人    |         1 |
|  2 | 张夫人    |         2 |
+----+-----------+-----------+
#CASCADE  将产生级联删除
>>> Author.objects.get(id=1).delete()
(2, {'oto.Wife': 1, 'oto.Author': 1}) #王夫人随之删除
>>> Wife.objects.get(id=2).delete()
(1, {'oto.Wife': 1})  #张老师不受影响> select * from oto_author;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | 张老师       |
|  3 | 小李老师     |
+----+--------------+
2 rows in set (0.00 sec)> select * from oto_wife;
Empty set (0.00 sec)

添加数据

>>> wife1 = Wife.objects.create(name='张夫人', author_id=author2.id)
>>> author1 = Author.objects.create(name='王老师')
>>> wife1 = Wife.objects.create(name='王夫人', author=author1)
> select * from oto_author;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | 张老师       |
|  3 | 小李老师     |
|  4 | 王老师       |
+----+--------------+> select * from oto_wife;
+----+-----------+-----------+
| id | name      | author_id |
+----+-----------+-----------+
|  3 | 张夫人    |         2 |
|  4 | 王夫人    |         4 |
+----+-----------+-----------+

数据查询

  1. 正向查询:直接通过关联属性查询即可

    # 通过 wife 找 author 
    from oto.models import Wife
    wife = Wife.objects.get(name='王夫人')
    print(wife.name, '的老公是', wife.author.name)#王夫人 的老公是 王老师
    
  2. 反向查询

    • 通过反向关联属性查询
    • 反向关联属性为实例对象.引用类名(小写),如作家的反向引用为作家对象.wife
    • 当反向引用不存在时,则会触发异常
    # 通过 author.wife 关联属性 找 wife,如果没有对应的wife则触发异常
    author1 = Author.objects.get(name='王老师')
    print(author1.name, '的妻子是', author1.wife.name)author2 = Author.objects.get(name='小李老师')
    try:print(author2.name, '的妻子是', author2.wife.name)
    except:print(author2.name, '还没有妻子')#小李老师 还没有妻子 
    

一对多映射ForeignKey

一对多是表示现实事物间存在的一对多的对应关系。语法:当一个A类对象可以关联多个B类对象时

class A(model.Model):...class B(model.Model):属性 = models.ForeignKey("一"的模型类, on_delete=xx)

创建项目

[root@vm mysite5]# python3 manage.py startapp otm
[root@vm mysite5]# vim mysite5/settings.py
INSTALLED_APPS = [
...'otm',  

创建模型类

[root@vm mysite5]# vim otm/models.py
from django.db import modelsclass Publisher(models.Model):# 有一个反向属性,book_setname = models.CharField("名称", max_length=50,unique=True)class Book(models.Model):title = models.CharField('书名', max_length=50)publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)[root@vm mysite5]# python3 manage.py makemigrations
[root@vm mysite5]# python3 manage.py migrate
> desc otm_publisher;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+desc otm_book;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| title        | varchar(50) | NO   |     | NULL    |                |
| publisher_id | int(11)     | NO   | MUL | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

创建数据

#先创建 '一' ,再创建 '多'
from otm.models import *
pub1 = Publisher.objects.create(name='清华大学出版社')#用对象关联
Book.objects.create(title='python', publisher=pub1)
#用主键关联
Book.objects.create(title='Java', publisher_id=1)  #高级创建 - 利用 反向属性
pub2 = Publisher.objects.create(name='北京大学出版社')
pub2.book_set.create(title='西游记')> select * from otm_publisher;
+----+-----------------------+
| id | name                  |
+----+-----------------------+
|  2 | 北京大学出版社        |
|  1 | 清华大学出版社        |
+----+-----------------------+> select * from otm_book;
+----+--------------+--------------+
| id | title        | publisher_id |
+----+--------------+--------------+
|  1 | python       |            1 |
|  2 | Java         |            1 |
|  3 | 西游记       |            2 |
|  4 | 红楼梦       |            2 |
|  5 | 三国演义     |            2 |
+----+--------------+--------------+

数据查询

通过 Book 查询 Publisher【正向】

通过 publisher 属性查询即可 book.publisher>>> Book.objects.get(title='java').publisher.name
'清华大学出版社'abook = Book.objects.get(id=1)
print(abook.title, '的出版社是:', abook.publisher.name)

通过 Publisher 查询 对应的所有的 Book 【反向】

Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用
属性:book_set  等价于 objects# 通过出版社查询对应的书
pub1 = Publisher.objects.get(name='清华大学出版社')
books = pub1.book_set.all()  # 通过book_set 获取pub1对应的多个Book数据对象
#books = Book.objects.filter(publisher=pub1)  # 也可以采用此方式获取
print("清华大学出版社的书有:")
for book in books:print(book.title)

多对多映射ManyToManyField

多对多表达对象之间多对多复杂关系,不用指定on_delete,语法:在关联的两个类中的任意一个类中,增加:

属性 = models.ManyToManyField(MyModel)

创建项目

一个作者可以出版多本图书,一本图书可以被多名作者同时编写

[root@vm mysite5]# python3 manage.py startapp mtm
[root@vm mysite5]# vim mysite5/settings.py
INSTALLED_APPS = [
...'mtm',  

创建模型类

[root@vm mysite5]# vim mtm/models.py
class Author(models.Model):name = models.CharField('作家', max_length=50)class Book(models.Model):title = models.CharField('书名', max_length=50)authors = models.ManyToManyField(Author)[root@vm mysite5]# python3 manage.py makemigrations
[root@vm mysite5]# python3 manage.py migrate> desc mtm_author;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+> desc mtm_book;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| title | varchar(50) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+> desc mtm_book_authors;
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| book_id   | int(11) | NO   | MUL | NULL    |                |
| author_id | int(11) | NO   | MUL | NULL    |                |
+-----------+---------+------+-----+---------+----------------+

创建数据

from mtm.models import * #   方案1 先创建 author 再关联 bookauthor1 = Author.objects.create(name='吕老师')
author2 = Author.objects.create(name='王老师')
# 关联图书
book11 = author1.book_set.create(title="Python")
author2.book_set.add(book11) > select * from mtm_author;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | 吕老师    |
|  2 | 王老师    |
+----+-----------+
2 rows in set (0.00 sec)> select * from mtm_book;
+----+--------+
| id | title  |
+----+--------+
|  1 | Python |
+----+--------+
1 row in set (0.00 sec)> select * from mtm_book_authors;
+----+---------+-----------+
| id | book_id | author_id |
+----+---------+-----------+
|  1 |       1 |         1 |
|  2 |       1 |         2 |
+----+---------+-----------+方案2 先创建 book 再关联 author
book = Book.objects.create(title='java')
author3 = book.authors.create(name='李老师')
book.authors.add(author1)

数据查询

  1. 通过 Book 查询对应的所有的 Author【正向】
from mtm.models import * >>> b1 = Book.objects.get(title='java')
>>> authors = b1.authors.all()
>>> for a in authors:
...    print(a.name)
...
王老师author1 = Author.objects.get(name='吕老师')
book.authors.all() -> 获取 book 对应的所有的author的信息
book.authors.filter(age__gt=80) -> 获取book对应的作者中年龄大于80岁的作者的信息
  1. 通过 Author 查询对应的所有的Book【反向】

Django会生成一个反向属性 book_set 用于表示对对应的book的查询对象相关操作

>>> author1 = Author.objects.get(name='吕老师')
>>> books=author1.book_set.all()   # author1.book_set.filter()>>> for book in books:
...    print(book.title)
...
Python

表的关联关系总结

一对一属性 = models.OneToOneField(A, on_delete=xxx)1. 生成表结构2. 添加数据3. 查询数据3.1 正向查询   3.2 反向查询 一对多【使用最多】属性 = models.ForeignKey("一"的模型类, on_delete=xx)1. 生成表结构2. 添加数据多对多【难度最大】属性 = models.ManyToManyField(MyModel)

添加到djanto管理界面

[root@vm mysite5]# python3 manage.py createsuperuser
用户名 (leave blank to use 'root'): tarena[root@vm mysite5]# vim mtm/admin.py
from django.contrib import admin
from .models import *# Register your models here.
class AuthorManager(admin.ModelAdmin):list_display = ['id','name']list_display_links = ['id','name']
class BookManager(admin.ModelAdmin):list_display = ['id','title']
admin.site.register(Author,AuthorManager)
admin.site.register(Book,BookManager)#__str__重写,不重写 django的web界面显示的是object对象,没可读写
[root@vm mysite5]# vim mtm/models.py
class Author(models.Model):name = models.CharField('作家', max_length=50)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField('书名', max_length=50)authors = models.ManyToManyField(Author)def __str__(self):return self.title#浏览器访问,体验功能管理  		

cookies 和 session

会话 - 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。HTTP协议是无状态的,导致会话状态难以保持。Cookies和Session就是为了保持会话状态而诞生的两个存储技术

#新建项目,初始化配置
[root@vm ~]# mysql -uroot -p123456 -e 'create database mysite6 default charset utf8;'
[root@vm ~]# django-admin startproject mysite6
[root@vm ~]# cd mysite6/
[root@vm mysite6]# vim mysite6/settings.pyALLOWED_HOSTS = ['*',]
DATABASES = {'default' : {'ENGINE': 'django.db.backends.mysql','NAME': 'mysite6','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': 3306,}
}LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = "Asia/Shanghai"[root@vm mysite6]# python3 manage.py runserver 0.0.0.0:8000

cookies

查看和操作浏览器端所有的 Cookies 值Chrome 浏览器 可能通过开发者工具的Application >>Storage >>Cookies火狐浏览器 可能通过开发者工具的 存储 -> Cookie
cookies是"保存在客户端"浏览器上的存储空间,cookies 在浏览器上是以键-值对的形式进行存储的,键和值都是"以ASCII字符串"的形存储cookies中的数据是"按域"存储隔离的,不同的域之间无法访问cookies 每次访问此网址时都会携带到服务器端,如果"cookies过大会降低响应速度"cookies  不要存储敏感的信息,不安全,(存储sessionid,相对安全)

Django 设置COOKIE

在Django 设置浏览器的COOKIE 必须通过 HttpResponse 对象来完成

  • 添加、修改COOKIE

    HttpResponse.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)
    - 删除指定的key 的Cookie。 如果key 不存在则什么也不发生。
    
  • 获取cookie

    通过 request.COOKIES 绑定的字典(dict) 获取客户端的 COOKIES数据

    value = request.COOKIES.get('cookies名', '默认值')
    print("cookies名 = ", value)
    

使用示例

添加cookie

[root@vm mysite6]# vim mysite6/urls.py
urlpatterns = [
...path('set_cookie',views.set_cookie),
][root@vm mysite6]# vim mysite6/views.py
from django.http import HttpResponsedef set_cookie(request):resp = HttpResponse("set cookie ok!")resp.set_cookie('username','tarena',60)return resp

访问 http://192.168.1.11:8000/set_cookie

#开发者工具 查看cookie username的键值对儿
Application >>Storage >>Cookies>>http://192.168.1.11:8000#开发者工具  查看响应头
Network >>set_cookie >> Response Header >> Set-Cookie:
Set-Cookie: username=tarena; expires=Sun, ... GMT; Max-Age=60; Path=/

获取cookie

[root@vm mysite6]# vim mysite6/urls.py    path('get_cookie',views.get_cookie),
[root@vm mysite6]# vim mysite6/views.py
...
def get_cookie(request):name = request.COOKIES.get('username', 'no-value')return HttpResponse("cookie value is %s" % name)

访问 http://192.168.1.11:8000/get_cookie

#开发者工具  请求头
Network >>get_cookie >> resquest Header >> 没有cookie(已过期)刷新http://192.168.1.11:8000/set_cookie
再次访问 http://192.168.1.11:8000/get_cookie   页面显示:cookie value is tarenaNetwork >>get_cookie >> resquest Header >> Cookie: 末尾有username=tarena

删除cookie

[root@vm mysite6]# vim mysite6/urls.py  path('del_cookie',views.del_cookie),[root@vm mysite6]# vim mysite6/views.pydef del_cookie(request):resp = HttpResponse("del cookie ok!")resp.delete_cookie('username')return resp

访问 http://192.168.1.11:8000/del_cookie

Network >>set_cookie >> Response Header >> Set-Cookie:
Set-Cookie: username=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/
#注意 expires有效时间    Max-Age存活时间

session

session又名会话控制,是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据,实现方式

- 使用 session 需要在浏览器客户端启动 cookie,且用在cookie中存储sessionid
- 每个客户端都可以在服务器端有一个独立的Session
- 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
cookies 的特点1>保存在客户端浏览器2>按域隔离3>键值对存储4>不安全,不要保存敏感数据
session的特点1>保存在服务器2>session的使用需要借助于cookie来存储sessionid3>相对安全,但是也不要存储敏感数据     虽然session的原理和步骤都比cookie更复杂,但是在Django中使用时,由于做了相应的处理,反而使用更简单。会使用字典就会使用session。

Django中配置Session

在 settings.py 文件中,向 INSTALLED_APPS 列表中添加:

INSTALLED_APPS = [# 启用 sessions 应用,默认启用'django.contrib.sessions',
]

向 MIDDLEWARE 列表中添加:

MIDDLEWARE = [# 启用 Session 中间件,默认启用'django.contrib.sessions.middleware.SessionMiddleware',
]
[root@vm mysite6]# python3 manage.py makemigrations
[root@vm mysite6]# python3 manage.py migrate> show tables;
+----------------------------+
| Tables_in_mysite6          |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
> desc django_session;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| session_key  | varchar(40) | NO   | PRI | NULL    |       |
| session_data | longtext    | NO   |     | NULL    |       |
| expire_date  | datetime(6) | NO   | MUL | NULL    |       |
+--------------+-------------+------+-----+---------+-------+

session的基本操作:

  • session对于象是一个类似于字典的SessionStore类型的对象, 可以用类拟于字典的方式进行操作
  • session 只能够存储能够序列化的数据,如字典,列表等。
保存 session 的值到服务器request.session['KEY'] = VALUE获取session的值VALUE = request.session['KEY']VALUE = request.session.get('KEY', 缺省值)删除session的值del request.session['KEY']在 settings.py 中有关 session 的设置1. SESSION_COOKIE_AGE- 作用: 指定sessionid在cookies中的保存时长(默认是2周),如下:- SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 22. SESSION_EXPIRE_AT_BROWSER_CLOSE = True设置只要浏览器关闭时,session就失效(默认为False)  当使用session时需要迁移数据库,否则会出现错误python3 manage.py migrate

session添加

[root@vm mysite6]# vim mysite6/urls.pypath('set_session',views.set_session),path('get_session',views.get_session),[root@vm mysite6]# vim mysite6/views.py
...
def set_session(request):request.session['username'] = 'tarena'return HttpResponse("set session is ok")
def get_session(request):username = request.session.get('username', 'no-value')return HttpResponse("user name  is %s" % username)

http://192.168.1.11:8000/set_session

#开发者工具 查看cookie username的键值对儿
Application >>Storage >>Cookies>>http://192.168.1.11:8000
sessionid: kim2qi8v4lcfy92ax9r7gn6r4c4zkj0v
#开发者工具  查看响应头
Set-Cookie: sessionid=kim2qi8v4lcfy92ax9r7gn6r4c4zkj0v
这与数据库里存储的session_key是同一个> select * from  django_session\G
*************************** 1. row ***************************session_key: kim2qi8v4lcfy92ax9r7gn6r4c4zkj0v
session_data: YjFkZjBiZmQ4MzFhZDIwZWI0YWZhNDMxOTE5ZDE0Nj...
...http://192.168.1.11:8000/get_session
user name is tarena

session删除

[root@vm mysite6]# vim mysite6/urls.pypath('del_session',views.del_session),[root@vm mysite6]# vim mysite6/views.py
def del_session(request):if 'username' in request.session:del request.session['username']return HttpResponse("del session   is ok")

设置session 时间

[root@vm mysite6]# vim mysite6/settings.py
SESSION_COOKIE_AGE = 60http://192.168.1.11:8000/set_session     看响应头Max-Age=60

删除已过期session

django 原生session 问题:

1,django_session表是 单表设计;且该表数据量持续增持,不会删除包括恶意删除的sessionid(客户端手动删掉sessionid,重新请求服务器生成新的)过期的sessionid数据
2,可以每晚执行 python3 manage.py clearsessions可删除已过期的session数据恶意删除的sessionid,未过期,命令无法删除

相关文章:

pt26django教程

admin 后台数据库管理 django 提供了比较完善的后台管理数据库的接口&#xff0c;可供开发过程中调用和测试使用 django 会搜集所有已注册的模型类&#xff0c;为这些模型类提拱数据管理界面&#xff0c;供开发者使用 创建后台管理帐号: [rootvm mysite2]# python3 manage.…...

javabasic

计算机基础 一、学前知识 1. 计算机组成 2. 进制的概念 &#xff08;1&#xff09;二进制的存储 计算机不管是内存还是硬盘&#xff0c;都是以二进制的形式存储。如同一张巨大的表格&#xff0c;里面都是由0和1组成。 二进制&#xff1a;逢2进1 基数为2&#xff0c;数值部分…...

电子词典项目

目录 目录 头文件&#xff1a;dict.h: 源文件&#xff1a;dict.c: 服务器测试文件&#xff1a;serDict.c: 客户端测试文件&#xff1a;cliDict.c: 头文件&#xff1a;dict.h: #ifndef __DICT_H__ #define __DICT_H__ #include<myhead.h> #include<sqlite3.h>#de…...

SQL12 高级操作符练习(2)

描述 题目&#xff1a;现在运营想要找到学校为北大或GPA在3.7以上(不包括3.7)的用户进行调研&#xff0c;请你取出相关数据&#xff08;使用OR实现&#xff09; 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.03…...

python写代码过程中的坑230915

1.解释代码IndentationError: expected an indented block 这个错误通常是由于代码缩进错误导致的。 在Python中,代码块(如循环、条件语句、函数等)通常使用缩进来表示。因此,如果你在期望缩进的位置没有正确缩进代码,就会出现"IndentationError: expected an inden…...

SpringBoot课堂笔记20230913

本篇文章为SpringBoot学习笔记&#xff0c;方便自己再复习。 Maven&#xff1a;jar包管理工具 注解&#xff1a; Controller:处理http请求&#xff0c;返回的视图 RestController: 相当于ResponseBody和Controller一起用&#xff0c;返回的是json ResponseBody:返回响应内容 …...

3D数字孪生:从3D数据采集到3D内容分析

数字孪生&#xff08;Digital Twin&#xff09;是物理对象、流程或系统的虚拟复制品&#xff0c;用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要&#xff0c;因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…...

【杂记】git管理工具的相关应用

这里记录一些用git管理工具进行开发的命令&#xff0c;便于自己查看&#xff0c;我认为下面两篇博客写的很详细&#xff0c;但是为了自己方便查看&#xff0c;所以自己写了一些命令供自己进一步理解。gitee相对git来说更方便一些&#xff08;毕竟国内的不用担心墙&#xff09;&…...

看好多人都在劝退学计算机,可是张雪峰又 推荐过计算机,所以计算机到底是什么样 的?

张雪峰高考四百多分&#xff0c;但是他现在就瞧不起400多分的学生。说难听点&#xff0c;六七百分的 热门专业随便报谁不会啊&#xff1f; 计算机专业全世界都是过剩的&#xff0c;今年桂林电子科技&#xff0c;以前还是华为的校招大学&#xff0c;今年 计算机2/3待业。这个世…...

leetcode 26.删除有序数组中的重复项

给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你需要做…...

jitsi音视频会议集成到自己的网页中

将jitsi视频会议集成到自己的web网站&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><meta name"viewport" content&…...

浅析Java责任链模式实现

一、概要 定义&#xff1a;责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 二、应用场景&#xff1a; 1.多条件流程判断&#xff1a;权限相关…...

SpringBoot雪花算法主键ID传到前端后精度丢失问题的解决

Java后端Long类型的范围 -263~263&#xff0c;即&#xff1a;-9223372036854775808~9223372036854775807&#xff0c;它是19位的。 这个数字可以通过方法获得&#xff1a;Long.MAX_VALUE、Long_MIN_VALUE。 前端JS的数字类型的范围 -253~253&#xff0c;即&#xff1a;-9007…...

vue使用elementUI的upload上传文件封装

这篇文章的目的 将文件上传的方法封装一下&#xff0c;供大家统一调用, 话不多说&#xff0c;直接上代码 upload 核心参数说明 action 上传的地址accept 接受上传的文件类型multiple 是否开启多文件上传模式limit 限制上传个数fileList 文件列表disabled 是否禁用 upload 核心方…...

cenos自动启动tomcat

首先创建一个脚本 关闭tomcat 等待2分钟 启动tomcat 并且把日志输出在 /usr/local/tomcat/tomcatchognqi.log #!/bin/bashexport JAVA_HOME/usr/local/jdk/jdk1.8.0_211 export JRE_HOME$JAVA_HOME/jre# 日志文件路径和文件名 LOG_FILE"/usr/local/tomcat/tomcatchognqi.…...

OSI模型与数据的封装

1、OSI模型 上层|| 七层模型 四层模型|| 应用层| 表示层 应用层 http/ftp/ssh/ftps| 会话层 -----------------------------------------------------------------------| 传输层 传输层 tcp/udp ------------------------------…...

【李沐深度学习笔记】数据操作

本课观看地址 数据操作p1 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 1-d向量就是样本的各特征抽象成一个向量&#xff1b;2-d矩阵的每一行是一个样本&#xff0c;每一行都是一个样本的特征向量 3-d可以表示RGB图片&#xff0c;RGB图像是一个三维数组&#xff…...

【蓝桥杯选拔赛真题61】Scratch小猫照镜子 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch小猫照镜子 一、题目要求 编程实现 二、案例分析 1、角色分析...

vue3将页面导出成PDF文件(完美解决图片、表格内容分割问题)

vue3将页面导出成PDF文件&#xff08;完美解决图片、表格内容分割问题&#xff09; 1、安装依赖2、在utils中创建htmlToPDF.js文件3、在vue中引入并使用 1、安装依赖 npm install --save html2canvas // 页面转图片 npm install jspdf --save // 图片转pdf2、在utils中创建h…...

软件测试:黑盒测试用例的四种设计方法

一、输入域测试用例设计方法 输入域测试法是一种综合考虑了等价类划分、边界值分析等方法的综合方法&#xff0c;针对输入域测试法中可能出现的各种情况&#xff0c;输入域测试法主要考虑三个方面&#xff1a;  (1)极端测试(ExtremalTesting)&#xff0c;要求在输入域中选择测…...

数据库开发-MySQL基础DQL和多表设计

1. 数据库操作-DQL DQL英文全称是Data Query Language(数据查询语言)&#xff0c;用来查询数据库表中的记录。 1.1 介绍 查询关键字&#xff1a;SELECT 查询操作是所有SQL语句当中最为常见&#xff0c;也是最为重要的操作。在一个正常的业务系统中&#xff0c;查询操作的使…...

PowerDesigner 逆向工程以及IDEA中UML插件

1、MySQL数据库连接&#xff08;JDBC方式&#xff09; 1.1 新建一个pdm&#xff0c;dbms选择mysql 1.2 Database - Connect 选择数据库连接 1.3 配置连接信息 数据库连接这里是通过一个配置文件来获取连接信息的&#xff0c;首次的话因为没有&#xff0c;所以我们需要选择…...

企业架构LNMP学习笔记56

MongoDB数据类型操作&#xff1a;CURD 1、添加数据&#xff1a; mongodb里存储数据的格式文档形式&#xff0c;以bson格式的文档形式。 创建数据库&#xff1a; > use tp5shop switched to db tp5shop > db.getName() tp5shop使用切换库&#xff0c;不存在自动创建&am…...

[Linux入门]---搭建Linux环境

1.Linux环境的搭建方式 使用Linux操作系统的三种途径&#xff1a; 1.直接安装在物理机上&#xff0c;但是由于 Linux 桌面使用起来非常不友好&#xff0c;不推荐。 2.使用虚拟机软件&#xff0c;将 Linux 搭建在虚拟机上&#xff0c;但是由于当前的虚拟机软件(如 VMWare 之类的…...

性能测试知多少---性能分析与调优的原理

最近一直纠结性能分析与调优如何下手&#xff0c;先从硬件开始&#xff0c;还是先从代码或数据库。从操作系统&#xff08;CPU调度&#xff0c;内存管理&#xff0c;进程调度&#xff0c;磁盘I/O&#xff09;、网络、协议&#xff08;HTTP&#xff0c; TCP/IP &#xff09;&…...

“对象创建”模式

通过“对象创建”模式绕开new&#xff0c;来避免对象创建 (new) 过程中所导致的紧耦合(依赖具体类)从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory MethodAbstract FactoryPrototypeBuilder Factory Method 动机 (Motivation) 在软件系统中&am…...

ipad手写笔有必要买吗?好用的平板触控笔

众所周知&#xff0c;随着Apple pencil的出现&#xff0c;市面上出现越来越多平替电容笔的出现&#xff0c;无论是价格和功能&#xff0c;几乎都很接近。很多小伙伴不知如何下手&#xff0c;不知道如何从众多品牌中挑选出适合自己的电容笔&#xff0c;今天我为大家总结一下网上…...

OpenGL ES视频特效开发参考Shadertoy参数详解参考Godot文档

今天一个大厂的学员过来问shadertoy上一些参数的问题&#xff0c;因为我之前用过一段时间Godot引擎&#xff0c; 我清晰记得Godot官方文档有明确的解释&#xff0c;所以整理下发给做特效的同学。 Shadertoy是一个网站&#xff0c;它方便用户编写片段着色器并创造出纯粹的魔法。…...

java:逆序排序的三种方法

// 逆序第一种方法 public static void main(String[] args) {int arr[] {11, 22, 33, 44, 55, 66};for (int i arr.length-1; i > 0; i--) {System.out.print("\t"arr[i]);}}缺点&#xff1a;这个是直接逆转&#xff0c;如果里面是随机数没办法比较 逆序第二种…...

pgsql操作json类型

目录 一、表结构 二、实体类 三、json处理器 四、配置文件 五、josn数据 1、插入 2、查找 一、表结构 CREATE TABLE "public"."pg_user" ("id" int8 NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 MINVALUE 1 MAXVALUE 92233720…...

做策划的网站推广/seo美式

假设下面是你的视频网站链接列表&#xff0c;如果别人想爬取你的数据十分轻松&#xff0c;看规则就知道数据库是序列自增的 http://www.xxxx.com/video/1 http://www.xxxx.com/video/2 http://www.xxxx.com/video/3 那么解决这一问题&#xff0c;我们可以使用短地址&#xff0c…...

网站美化教程下载/百度官方免费下载

find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.h" -or -name "*.rss" ")" -print | xargs wc -l转载于:https://www.cnblogs.com/ftrako/p/8295421.html...

南京手机网站制作公司/网站制作设计

先扯两句 经过了漫长的时间&#xff0c;六大设计原则终于结束了&#xff0c;也终于进入到了23中设计模式的学习了。不过设计原则只有六条都写了这么久&#xff0c;设计模式有足足23种&#xff0c;希望这次不要再懒惰了吧。   厚着脸皮激励一下自己《设计模式》——目录&#…...

c 转网站开发/网站怎样被百度收录

__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比.__thread变量每一个线程有一份独立实体,各个线程的值互不干扰,可以用来修饰那些带有全局性且值可以变,但是又不值的用全局变量保护的变量. __thread使用规则&#xff1a;只能修饰POD类型(类似整型指针的标量…...

网站空间期限查询/友情链接qq群

文章目录一、配置数据源-mysql二、下载安装1.1 下载包安装(已验证)1.2 Github 上下载源码(未验证)1.3 docker安装(已验证)三、springCloud pom主要配置3.1 pom3.2 bootstrap.yaml部分配置3.3 nacos设置对应一、配置数据源-mysql a:配置数据库 /*Navicat Premium Data Transfe…...

长沙专业做网站的公司/关注公众号推广2元一个

今天&#xff0c;一年一度的高考又再次来临。如今高考已不仅是高考生的一件大事&#xff0c;也成为了科技圈的一大热点。继去年人工智能机器人“准星AI-MATHS”首次公开挑战高考数学考试后&#xff0c;人工智能再次与众多高考生一起走进考场&#xff0c;这次挑战的是高考作文。…...