开源web框架django知识总结
Posted 主打Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源web框架django知识总结相关的知识,希望对你有一定的参考价值。
开源web框架django知识总结(五)
一、admin后台管理
什么是admin管理后台?django提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用
django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,提供开发者使用
创建后台管理账号,该账号为管理后台最高权限账号
python3 manage.py createsuperuser
使用admin后台管理,创建用户,创建组
注册自定义模型类
若要自己定义的模型类也能在/admin后台管理界面中显示和管理,需要将自己的类注册到后台管理界面
注册步骤:
1,在应用app中的admin.py中导入注册需要的管理的模型models类,如 from .models import Book
2,调用 admin.site,register 方法进行注册,如: admin.site.register(自定义模型类)
admin.site.register(Book)
模型管理类
作用:为后台管理界面添加便于操作的新功能 说明:后台管理器类必须继承自django.contrib.admin里的ModelAdmin类
使用方法:1、在<应用app>/admin.py里定义模型类管理器类
class XXXManager(admin.ModelAdmin):
...
2、绑定注册模型管理器和模型类
from django.contrib import admin
from .models import *
admin.site.register(YYYY,XXXXManager) # 邦定YYYY模型类与管理器类XXXXManager
admin.py
from django.contrib import admin
from .models import Book
# Register your models here.
admin.site.register(Book)
from django.contrib import admin
from .models import Book
# Register your models here.
class BookManager(admin.ModelAdmin):
#列表页显示哪些字段的列
list_display = ['id', 'title', 'pub', 'price']
#控制list_display中的字段 哪些可以链接到修改页
list_display_links = ['title']
#添加过滤器
list_filter = ['pub']
#添加搜索框[模糊查询]
search_fields = ['title']
#添加可在列表页编辑的字段
list_editable = ['price']
admin.site.register(Book, BookManager)
1、list_display 去控制哪些字段会显示在Admin的修改列表页中
2、list_display_links可以控制list_display中的字段是否该链接到对象的“更改”页面
3、list_filter设置激活Admin修改列表页面右侧栏中的过滤器
4、search_fields设置启用Admin更改列表页上的搜索框
5、list_editable设置为模型上的字段名称列表,这将允许在更改列表页面上进行编辑
再谈Meta类
通过Meta内嵌类,定义模型类的属性,用法如下:
admin.py
class AuthorManager(admin.ModelAdmin):
list_display = ['id', 'name', 'age']
admin.site.register(Author, AuthorManager)
二、关系映射
什么是关系映射?在关系型数据库中,通常不会把所有数据都放在同一张表中,不易于拓展,常见关系映射有:
1、,如:一个身份证对应一个人
一对一是表示现实事务间存在的一对一的对用关系。
语法:OneToOneField(类名,on_delete=xxx)
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
SET_NULL设置ForeignKey null;需要指定null=True
SET_DEFAULT将ForeignKey设置为其默认值;必须设置ForeignKey的默认值
from django.db import models
# Create your models here.
class Author1(models.Model):
#wife 反向属性
name = models.CharField('姓名', max_length=11)
class Wife1(models.Model):
name = models.CharField('姓名', max_length=11)
author = models.OneToOneField(Author1, on_delete=models.CASCADE)
数据创建
>>> from bookstore.models import Author1
>>> from bookstore.models import Wife1
无外键的模型类【Author1】:
author = Author1.objects.create(name=‘王老师’)
有外键的模型类【Wife1】
wife = Wife1.objects.create(name=‘王夫人’,author=author) #关联王老师
wife = Wife1.objects.create(name=‘王夫人’,author_id=1) # 关联王老师对应主键值
查询数据
1)正向查询:直接通过外键属性查询,则称为正向查询
# 通过wife找author
from .models import Wife1
wife = Wife1.objects.get(name='王夫人')
print(wife.name,'的老公是',wife.author.name)
2)反向查询:没有外键属性一方,可以调用反向属性查询到关联的另一方。
反向关联属性为“实例对象.引用类名(小写)”,如作家的反向引用为“作家对象.wife”。当反向引用不存在时,则触发异常
author1 = Author1.objects.get(name='王老师')
author1.wife1.name
2、一对多映射,如:一个班可以有多个学生 一对多需要明确出具体角色,在多表上设置外键
语法:当一个A类对象可以关联多个B类对象时
class A(model.Model):
...
class B(model.Model):
属性 = models.ForeignKey("一"的模型类,on_delete=xx) # 必须指定on_delete模式
示例:创建模型类 models.py
from django.db import models
# Create your models here.
class Publisher(models.Model):
#出版社 [一]
name = models.CharField('出版社名称', max_length=50)
class Book1(models.Model):
#书名 [多]
title = models.CharField('书名', max_length=11)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
创建数据,先创建“一”,再创建“多”
>>> from bookstore.models import Publisher
>>> from bookstore.models import Book1
>>> pub1 = Publisher.objects.create(name='清华大学出版社')
>>> Book1.objects.create(title='C++',publisher=pub1)
<Book1: Book1 object (1)>
>>> Book1.objects.create(title='Java',publisher_id=1)
<Book1: Book1 object (2)>
>>>
1)正向查询【通过Book1查询Publisher】
#通过 publisher属性查询即可
#book1.pulisher
abook = Book1.objects.get(id=1)
print(abook.title,'的出版社时:',abook.publisher.name)
2)反向查询【通过Pubilsher查询对应的所有的Book】,需要用到反向查询
>>> pub1 = Publisher.objects.get(name='清华大学出版社')
>>> books = pub1.book1_set.all() #注意这里写法
>>> for book in books:
... print(book.title)
...
C++
Java
>>>
3、多对多映射,如:一个学生可以报多个课程,一个课程可以有多个学生学习
定义:多对多表达对象之间多对多复杂关系,如:每个学生都有不同的学校(小学、初中…),每个学校都有不同的学生…
mysql中,创建多对多需要依赖第三张表来实现;django中无需手动创建第三张表,自动完成。
语法:在关联的两个类中的任意一个类中,增加: 属性 = models.ManyToManyField(MyModel)
用法示例:一个作者可以出版多本图书,一本图书可以被多名作者同时编写
from django.db import models
# Create your models here.
class Author2(models.Model):
name = models.CharField('姓名', max_length=11)
class Book2(models.Model):
title = models.CharField('书名', max_length=11)
authors = models.ManyToManyField(Author2)
多对多创建数据:
>>> from bookstore.models import Author2
>>> from bookstore.models import Book2
#方案一:先创建author,再关联book(王老师、李老师同时写一本书python)
>>> author1 = Author2.objects.create(name='王老师')
>>> author2 = Author2.objects.create(name='李老师')
>>> book1 = author1.book2_set.create(title='Python')
>>> author2.book2_set.add(book1)
#方案二:先创建book,再关联author(王老师与郭老师同时写一本django)
>>> book2 = Book2.objects.create(title='Django')
>>> author3 = book2.authors.create(name='郭老师')
>>> book2.authors.add(author1)
>>>
多对多查询数据:
1)正向查询:有多对多属性的对象 查 另一方 通过Book查询对应所有的Author,此时多对多属性等价于objects
book1.authors.all() # ->获取book对应的所有author的信息
>>> print(book1.authors.all())
<QuerySet [<Author2: Author2 object (3)>, <Author2: Author2 object (4)>]>
>>> author_names = book1.authors.all()
>>> for author_name in author_names:
... print(author_name.name)
...
王老师
李老师
2)反向查询:通过Author查询对应的所有的Book,利用反向属性book_set
>>> author1.book2_set.all()
<QuerySet [<Book2: Book2 object (1)>, <Book2: Book2 object (2)>]>
>>> author2.book2_set.all()
<QuerySet [<Book2: Book2 object (1)>]>
>>> books=author1.book2_set.all()
>>> for book in books:
... print(book.title)
...
Python
Django
>>> books=author2.book2_set.all()
>>> for book in books:
... print(book.title)
...
Python
>>>
三、cookies和session
会话保持
会话定义:从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话。
HTTP协议是无状态的,导致会话状态难以保持。试想一下,如果不保持会话状态,在电商网站购物场景体验?
Cookies和Session就是为了保持会话状态而诞生的两个存储技术。
Cookies定义:保存在客户浏览器上的存储空间。Chrome浏览器可通过开发者工具的Application->Storage->Cookies查看和操作浏览器端所有的Cookies值。火狐浏览器,可通过开发者工具的 存储->Cookie查看
Cookies特点:在浏览器上以“键值对”的形式进行存储,键和值都是以ASCII字符串的形式存储(不能是中文字符串)。存储的数据带有生命周期,cookies中的数据是按域存储隔离的,不同的域之间无法访问。cookies的内部的数据会在每次访问此网址时,都会携带到服务器端,如果cookies过大会降低响应速度。
Cookies的存储:
# views.py
#from django.http import HttpResponse
#from django.shortcuts import render
def set_cookies(request):
resp = HttpResponse('set cookies is ok')
resp.set_cookie('uuname', 'gxn',500)
return resp
#urls.py
path('set_cookies', views.set_cookies),
存储示例:
删除Cookies:
# views.py
def get_cookies(request):
value = request.COOKIES.get('uuname')
return HttpResponse('value is %s'%(value))
# urls.py
path('get_cookies', views.get_cookies),
session定义:在服务器上开辟一段空间用于保存浏览器和服务器交互时的重要数据。
实现方式:使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid。每个客户端都可以在服务器上有一个独立的Session。注意:不同的请求者之间,不会共享这个数据,与请求者一一对应。
session初始配置:settings.py配置session(创建项目,默认开启)
1、向INSTALLED_APPS列表中添加:
INSTALLED_APPS = [
'djiango.contrib.sessions', # 启用sessions 应用
]
2、向MIDDLEWAREZ列表中添加:
MIDDLEWARE = [
'diango.contrib.sessions.middleware.SessinoMiddleware', # 启用session中间件
]
session的使用:对于一个类似字典的SessionStore类型对象,可以用类似字典的方式进行操作
session能够存储:字符串、整型、字典、列表等。
1)保存session的值到服务器: request.session[‘KEY’] = VALUE
2)获取session的值:value = request.sessino[‘KEY’] value = request.session.get(‘KEY’,默认值)
3)删除session:del request.session[‘KEY’]
#views.py
def set_session(request):
request.session['uname'] = 'wwc'
return HttpResponse('set session is ok')
def get_session(request):
value = request.session['uname']
return HttpResponse('session value is %s'%(value))
# urls.py
path('set_session', views.set_session),
path('get_session', views.get_session)
settings.py中相关配置项:
1,SESSION_COOKIE_AGE :作用,指定sessionid在cookies中保存时间(默认是2周),如下:
例如:
SESSION_COOKIE_AGE = 60*60*24*7*2
2,SESSION_EXPIRE_AT_BROWSER_CLOSE = True 设置只要关闭浏览器时,session就失效(默认为False)
注意:Django中的session数据保存在数据库中,所以使用session前需要确保已经执行过migrate
Django session的问题
1,django_session表,是单表设计;该表数据量持续增持【浏览器故意删掉sessionid&过期数据未删除】
2,可以每晚执行python3 manage.py clearsessions 【该命令可删除已过期的session数据】
祝大家学习python顺利!
以上是关于开源web框架django知识总结的主要内容,如果未能解决你的问题,请参考以下文章