博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python开发【第二十二篇】:Web框架之Django【进阶】
阅读量:4559 次
发布时间:2019-06-08

本文共 5628 字,大约阅读时间需要 18 分钟。

Model

到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作
 
View Code

django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)。

  PHP:activerecord

  Java:Hibernate 

    C#:Entity Framework

django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。

一、创建表

1、基本结构

1
2
3
4
5
6
from 
django.db 
import 
models
   
class 
userinfo(models.Model):
    
name 
= 
models.CharField(max_length
=
30
)
    
email 
= 
models.EmailField()
    
memo 
= 
models.TextField()
 
字段
 
参数
 
元信息
 
拓展知识

2、连表结构

  • 一对多:models.ForeignKey(其他表)
  • 多对多:models.ManyToManyField(其他表)
  • 一对一:models.OneToOneField(其他表)

应用场景:

  • 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
    例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
  • 多对多:在某表中创建一行数据是,有一个可以多选的下拉框
    例如:创建用户信息,需要为用户指定多个爱好
  • 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
    例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
 
字段以及参数

二、操作表

1、基本操作

 
基本操作

2、进阶操作(了不起的双下划线)

利用双下划线将字段和对应的操作连接起来

 
进阶操作

3、其他操作

 
其他操作

4、连表操作(了不起的双下划线)

利用双下划线和 _set 将表之间的操作连接起来

 
表结构实例
 
一对一操作
 
一对多
 
多对多操作

扩展:

a、自定义上传

 
View Code

b、Form上传文件实例

 
Form
 
Model
 
View

Form

django中的Form一般有两种功能:

  • 输入html
  • 验证用户输入
 
Form
 
View

扩展:ModelForm

在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义

 
View Code

跨站请求伪造

一、简介

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

二、应用

1、普通表单

2、Ajax

对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

view.py

text.html

更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

Cookie

1、获取Cookie:

1
2
3
4
5
6
request.COOKIES[
'key'
]
request.get_signed_cookie(key, default
=
RAISE_ERROR, salt
=
'', max_age
=
None
)
    
参数:
        
default: 默认值
           
salt: 加密盐
        
max_age: 后台控制过期时间

2、设置Cookie:

1
2
3
4
5
6
7
8
9
10
11
12
13
rep 
= 
HttpResponse(...) 或 rep = render(request, ...)
 
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt
=
'加密盐'
,...)
    
参数:
        
key,              键
        
value
=
'',         值
        
max_age
=
None
,     超时时间
        
expires
=
None
,     超时时间(IE requires expires, so 
set 
it 
if 
hasn't been already.)
        
path
=
'/'
,         Cookie生效的路径,
/ 
表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
        
domain
=
None
,      Cookie生效的域名
        
secure
=
False
,     https传输
        
httponly
=
False    
只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

1
2
<script src
=
'/static/js/jquery.cookie.js'
><
/
script>
$.cookie(
"list_pager_num"
30
,{ path: 
'/' 
});

Session

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

1、数据库Session

  2、缓存Session

3、文件Session

4、缓存+数据库Session

5、加密cookie Session

更多参考: 和 

扩展:Session用户验证

1
2
3
4
5
6
7
def 
login(func):
    
def 
wrap(request, 
*
args, 
*
*
kwargs):
        
# 如果未登陆,跳转到指定页面
        
if 
request.path 
=
= 
'/test/'
:
            
return 
redirect(
'http://www.baidu.com'
)
        
return 
func(request, 
*
args, 
*
*
kwargs)
    
return 
wrap

分页

一、Django内置分页

 
views.py
 
Html
 
扩展内置分页:views.py
 
扩展内置分页:Html

二、自定义分页

分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置。

1、设定每页显示数据条数

2、用户输入页码(第一页、第二页...)

3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

4、在数据表中根据起始位置取值,页面上输出数据


需求又来了,需要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]

1、设定每页显示数据条数

2、用户输入页码(第一页、第二页...)

3、设定显示多少页号

4、获取当前数据总条数

5、根据设定显示多少页号和数据总条数计算出,总页数

6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

7、在数据表中根据起始位置取值,页面上输出数据

8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

 
分页实例

总结,分页时需要做三件事:

  • 创建处理分页数据的类
  • 根据分页数据获取数据
  • 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]

缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

1、配置

a、开发调试

 
View Code

b、内存

 
View Code

c、文件

 
View Code

d、数据库

 
View Code

e、Memcache缓存(python-memcached模块)

 
View Code

f、Memcache缓存(pylibmc模块)

 
View Code

g. Redis缓存(依赖:pip3 install django-redis)

 
View Code
 
视图中链接并操作

2、应用

a. 全站使用

 
View Code

b. 单独视图缓存

 
View Code

c、局部视图使用

 
View Code

更多:

序列化

关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。

1、serializers

1
2
3
4
5
from 
django.core 
import 
serializers
 
ret 
= 
models.BookType.objects.
all
()
 
data 
= 
serializers.serialize(
"json"
, ret)

2、json.dumps

1
2
3
4
5
6
7
8
import 
json
 
#ret = models.BookType.objects.all().values('caption')
ret 
= 
models.BookType.objects.
all
().values_list(
'caption'
)
 
ret
=
list
(ret)
 
result 
= 
json.dumps(ret)

由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:

信号

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

1、Django内置信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Model signals
    
pre_init                    
# django的modal执行其构造方法前,自动触发
    
post_init                   
# django的modal执行其构造方法后,自动触发
    
pre_save                    
# django的modal对象保存前,自动触发
    
post_save                   
# django的modal对象保存后,自动触发
    
pre_delete                  
# django的modal对象删除前,自动触发
    
post_delete                 
# django的modal对象删除后,自动触发
    
m2m_changed                 
# django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    
class_prepared              
# 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    
pre_migrate                 
# 执行migrate命令前,自动触发
    
post_migrate                
# 执行migrate命令后,自动触发
Request
/
response signals
    
request_started             
# 请求到来前,自动触发
    
request_finished            
# 请求结束后,自动触发
    
got_request_exception       
# 请求异常后,自动触发
Test signals
    
setting_changed             
# 使用test测试修改配置文件时,自动触发
    
template_rendered           
# 使用test测试渲染模板时,自动触发
Database Wrappers
    
connection_created          
# 创建数据库连接时,自动触发

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

 
View Code
 
View Code

2、自定义信号

a. 定义信号

1
2
import 
django.dispatch
pizza_done 
= 
django.dispatch.Signal(providing_args
=
[
"toppings"
"size"
])

b. 注册信号

1
2
3
4
5
def 
callback(sender, 
*
*
kwargs):
    
print
(
"callback"
)
    
print
(sender,kwargs)
 
pizza_done.connect(callback)

c. 触发信号

1
2
3
from 
路径 
import 
pizza_done
 
pizza_done.send(sender
=
'seven'
,toppings
=
123
, size
=
456
)

转载于:https://www.cnblogs.com/caidapeng/p/10469460.html

你可能感兴趣的文章
【转】SWT/JFace的对话框
查看>>
2019-2-28作业
查看>>
VS2010+WDK开发环境搭建最简易方法
查看>>
果然逆天,处理一亿条int32数据排序,需要耗时32秒
查看>>
解锁Dagger2使用姿势(二) 之带你理解@Scope
查看>>
设计模式——抽象工厂模式详解
查看>>
十年,青春就是一转眼的事
查看>>
C++编程规范和各种资源
查看>>
两只小熊队高级软件工程第七次作业敏捷冲刺2
查看>>
[原创]如何编写多个阻塞队列连接下的多生产者多消费者的Python程序
查看>>
如何提高数据迁移和复制的速度
查看>>
.9图片
查看>>
android打开各种文件Intent
查看>>
[转][C#]单例模式之懒加载
查看>>
实验吧之【后台登录,加了料的报错注入,认真一点】(报错注入)
查看>>
MySQL无法存储Emoji表情问题
查看>>
HDFS集中式的缓存管理原理与代码剖析
查看>>
POJ1019 Number Sequence
查看>>
第十七章-异步IO
查看>>
Linux就该这么学
查看>>