标签:ken 表数据 完整性 登录 元数据 有一个 cap nal 分组
是,许多成功的网站和app都基于Django(Uber、Instagram),开放源代码,遵从BSD版权,采用MVC的软件设计模式,及模型M,视图V和控制器C。
(BSD:伯克利软件发行版,开源许可协议,保护原始作者的身份,至少得到身份认可,还可以防止其它人将产品据为己有)
def bulk_create(self, objs, batch_size=None):
# 批量插入
# batch_size表示一次插入的个数
objs
= [
models.DDD(name=‘r11‘),
models.DDD(name=‘r22‘)
]
models.DDD.objects.bulk_create(objs, 10)
- 作用:
- 对用户请求数据格式进行校验
- 自动生成HTML标签
- 区别:
- Form,字段需要自己手写。
class Form(Form):
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
- ModelForm,可以通过Meta进行定义
class MForm(ModelForm):
class Meta:
fields = "__all__"
model = UserInfo
- 应用:只要是客户端向服务端发送表单数据时,都可以进行使用,如:用户登录注册
1 方式一:重写构造方法,在构造方法中重新去数据库获取值
2 class UserForm(Form):
3 name = fields.CharField(label=‘用户名‘,max_length=32)
4 email = fields.EmailField(label=‘邮箱‘)
5 ut_id = fields.ChoiceField(
6 # choices=[(1,‘二B用户‘),(2,‘山炮用户‘)]
7 choices=[]
8 )
9 def __init__(self,*args,**kwargs):
10 super(UserForm,self).__init__(*args,**kwargs)
11 self.fields[‘ut_id‘].choices = models.UserType.objects.all().values_list(‘id‘,‘title‘)
12 方式二: ModelChoiceField字段
13 from django.forms import Form
14 from django.forms import fields
15 from django.forms.models import ModelChoiceField
16 class UserForm(Form):
17 name = fields.CharField(label=‘用户名‘,max_length=32)
18 email = fields.EmailField(label=‘邮箱‘)
19 ut_id = ModelChoiceField(queryset=models.UserType.objects.all())
20 依赖:
21 class UserType(models.Model):
22 title = models.CharField(max_length=32)
23 def __str__(self):
24 return self.title
43、django的Model中的ForeignKey字段中的on_delete参数有什么作用?
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:
1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值
2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性
3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御
具体配置如下:
template中添加{%csrf_token%}标签
45、django如何实现websocket?
利用dwebsocket在Django中使用Websocket
https://www.cnblogs.com/huguodong/p/6611602.html
46、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
https://www.cnblogs.com/wxp5257/p/7834090.html
ORM:Object?Relation Mapping(对象?关系映射)
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite……,如果数据库迁移,只需要更换Django的数据库引擎即可。
当前Python世界里最负盛名且最成熟的网络框架;已发展为应用最广泛的Python网络框架。Django的各模块之间结合得比较紧密,所以在功能强大的同时又是一个相对封闭的系统,但是其健全的在线文档及开发社区,使开发者在遇到问题时能找到解决方法。
Django遵守BSD版权
Django框架的特点
相对于其他Web框架,功能最完整,Django定义了服务发布、路由映射、模板编程、数据处理的一整套功能。这也意味着Django模块之间紧密耦合,开发者需要学习Django自己定义的这一整套技术。
Django的主要特点:
完善的文档:经过10多年的发展和完善,Django有广泛的应用和完善的在线文档,开发者遇到问题时可以搜索在线文档寻求解决方案。
集成数据访问组件:Django的Model层自带数据库ORM组件,使开发者无须学习其他数据库访问技术(dbi、SQLAlchemy等)。
强大的URL映射技术:Django使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性。
后台管理系统自动生成:开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。
错误信息非常完整:在开发调试过程中如果出现运行异常,则Django可以提供非常完整的错误信息帮助开发者定位问题,比如缺少xxx组件的配置引用等,这样可以使开发者马上改正错误。
Django的组成结构
Django是遵循MVC架构的Web开发框架,主要由以下几部分组成:
管理工具(Management):一套内置的创建站点、迁移数据、维护静态文件的命令工具。
模型(Model):提供数据访问接口和模块,包括数据字段、元数据、数据关系等的定义及操作。
视图(View):Django的视图层封装了HTTPRequest和Response的一系列操作和数据流,其主要功能包括URL映射机制、绑定模板等。
模板(Template):是一套Django自己的页面渲染模板语言,用若干内置的tags和filters定义页面的生成方式。
表单(Form):通过内置的数据类型和控件生成HTML表单。
管理站(Admin):通过声明需要管理的Model,快速生成后台数据管理网站。
Django最初用来制作在线新闻Web站点,于2005年加入了BSD许可证家族,成为开源网络框架。Django根据比利时的爵士音乐家DjangoReinhardt命名,作者这样命名Django意味着Django能优雅地演奏(开发)功能丰富的乐曲(Web应用)。
它是当前Python世界里最负盛名且最成熟的网络框架。最初用来制作在线新闻的Web站点,目前已发展为应用最广泛的Python网络框架。Django的各模块之间结合得比较紧密,所以在功能强大的同时又是一个相对封闭的系统,但是其健全的在线文档及开发社区,使开发者在遇到问题时能找到解决方法。
Django框架的特点
相对于Python的其他Web框架,Django的功能是最完整的,Django定义了服务发布、路由映射、模板编程、数据处理的一整套功能。这也意味着Django模块之间紧密耦合,开发者需要学习Django自己定义的这一整套技术。Django的主要特点如下。
完善的文档:经过10多年的发展和完善,Django有广泛的应用和完善的在线文档,开发者遇到问题时可以搜索在线文档寻求解决方案。
集成数据访问组件:Django的Model层自带数据库ORM组件,使开发者无须学习其他数据库访问技术(dbi、SQLAlchemy等)。
强大的URL映射技术:Django使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性。
后台管理系统自动生成:开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。
错误信息非常完整:在开发调试过程中如果出现运行异常,则Django可以提供非常完整的错误信息帮助开发者定位问题,比如缺少xxx组件的配置引用等,这样可以使开发者马上改正错误。
Django的组成结构
Django是遵循MVC架构的Web开发框架,其主要由以下几部分组成。
管理工具(Management):一套内置的创建站点、迁移数据、维护静态文件的命令工具。
模型(Model):提供数据访问接口和模块,包括数据字段、元数据、数据关系等的定义及操作。
视图(View):Django的视图层封装了HTTPRequest和Response的一系列操作和数据流,其主要功能包括URL映射机制、绑定模板等。
模板(Template):是一套Django自己的页面渲染模板语言,用若干内置的tags和filters定义页面的生成方式。
表单(Form):通过内置的数据类型和控件生成HTML表单。
管理站(Admin):通过声明需要管理的Model,快速生成后台数据管理网站。
在settings.py中添加:
LOGGING = {
‘disable_existing_loggers‘: False,
‘version‘: 1,
‘handlers‘: {
‘console‘: {
# logging handler that outputs log messages to terminal
‘class‘: ‘logging.StreamHandler‘,
‘level‘: ‘DEBUG‘, # message level to be written to console
},
},
‘loggers‘: {
‘‘: {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
‘handlers‘: [‘console‘],
‘level‘: ‘DEBUG‘,
‘propagate‘: False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
‘django.db‘: {
# # django also has database level logging
‘handlers‘: [‘console‘],
‘level‘: ‘DEBUG‘,
‘propagate‘: False,
},
},
}
三种粒度缓存
1 中间件级别
‘django.middleware.cache.UpdateCacheMiddleware‘,
‘django.middleware.cache.FetchFromCacheMiddleware‘,
CACHE_MIDDLEWARE_SECONDS=10
2 视图级别
from django.views.decorators.cache import cache_page
@cache_page(15)
def index(request):
import time
t=time.time()
return render(request,"index.html",locals())
3 局部缓存
{% load cache %}
...
...
{% cache 15 "time_cache" %}
<h3>缓存时间:{{ t }}</h3>
{% endcache %}
pip install django-redis
apt-get install redis-server
然后在settings.py 里面添加CACHES = {
‘default‘: {
‘BACKEND‘: ‘redis_cache.cache.RedisCache‘,
‘LOCATION‘: ‘127.0.0.1:6379‘,
"OPTIONS": {
"CLIENT_CLASS": "redis_cache.client.DefaultClient",
},
}
name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个小名”,只要这个名字不变,网址变了也能通过名字获取到。
simple_tag
-参数任意,但是不能作为if条件判断的条件
filter
-参数最多只能有两个,但是可以作为if条件判断的条件。
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。
包括查看执行的sql语句,db查询次数,request,headers,调试概览等。
https://blog.csdn.net/weixin_39198406/article/details/78821677
https://www.jianshu.com/p/34267dd79ad6
datebase first就是代表数据库优先,那么前提就是先创建数据库。
model first就是代表model优先,那么前提也就是先创建model,然后根据model自动建立数据库。
Django附带一个名为inspectdb的实用程序,可以通过检查现有的数据库来创建Model(模型)
django内置的ContentType组件就是帮我们做连表操作
如果一个表与其他表有多个外键关系,我们可以通过ContentType来解决这种关联
http://www.cnblogs.com/iyouyue/p/8810464.html
1.客户端-服务端分离
优点:提高用户界面的便携性,通过简化服务器提高可伸缩性….
2.无状态(Stateless):从客户端的每个请求要包含服务器所需要的所有信息
优点:提高可见性(可以单独考虑每个请求),提高了可靠性(更容易从局部故障中修复),提高可扩展性(降低了服务器资源使用)
3.缓存(Cachable):服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求
优点:减少交互次数,减少交互的平均延迟
4.统一接口
优点:提高交互的可见性,鼓励单独改善组件
5.支持按需代码(Code-On-Demand 可选)
优点:提高可扩展性
- 路由,自动帮助开发者快速为一个视图创建4个url
www.oldboyedu.com/api/v1/student/$
www.oldboyedu.com/api/v1/student(?P<format>\w+)$
www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
- 版本处理
- 问题:版本都可以放在那里?
- url
- GET
- 请求头
- 认证
- 问题:认证流程?
- 权限
- 权限是否可以放在中间件中?以及为什么?
- 访问频率的控制
- 匿名用户可以真正的防止?无法做到真正的访问频率控制,只能把小白拒之门外。
如果要封IP,使用防火墙来做。
- 登录用户可以通过用户名作为唯一标示进行控制,如果有人注册很多账号,也无法防止。
- 视图
- 解析器 ,根据Content-Type请求头对请求体中的数据格式进行处理。request.data
- 分页
- 序列化
- 序列化
- source
- 定义方法
- 请求数据格式校验
- 渲染器
a. 继承 APIView
1 这个类属于rest framework中顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操作都需要手动去完成,比较原始。
2
3 class GenericAPIView(APIView)
4 def post(...):
5 pass
b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
如果继承它之后,路由中的as_view需要填写对应关系 .as_view({‘get’:’list’,’post’:’create’})
在内部也帮助我们提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer
1 注意:要设置queryset字段,否则会跑出断言的异常。
2 # 只提供增加功能
3 class TestView(GenericViewSet):
4 serializer_class = XXXXXXX
5 def create(self,*args,**kwargs):
6 pass # 获取数据并对数据进行操作
c. 继承
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
1 对数据库和分页等操作不用我们在编写,只需要继承相关类即可。
2 示例:只提供增加功能
3 class TestView(mixins.CreateModelMixin,GenericViewSet):
4 serializer_class = XXXXXXX
如何编写?写类并实现authticate
方法中可以定义三种返回值:
(user,auth),认证成功
None , 匿名用户
异常 ,认证失败
流程:
dispatch
再去request中进行认证处理
67、django rest framework如何实现的用户访问频率控制?
a. 基于用户IP限制访问频率
b. 基于用户IP显示访问频率(利于Django缓存)
c. view中限制请求频率
d. 匿名时用IP限制+登录时用Token限制
django中请求处理方式有2种:FBV 和 CBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views)就是在视图里使用类处理请求 类需要继承view
前端请求—>nginx—>uwsgi.—>中间件—>url路由—->view试图—>orm—->拿到数据返回给view—->试图将数据渲染到模版中拿到字符串—->中间件—>uwsgi—->nginx—->前端渲染
url 、view、model、template、中间件
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。每个视图会返回一个HttpResponse 对象。
from django.views import
View
from django.utils.decorators import
method_decorator
def auth(func):
def inner(*args, **kwargs):
return
func(*args, **kwargs)
return inner
class UserView(View):
@method_decorator(auth)
def get(self, request, *args, **kwargs):
return
HttpResponse(‘...‘)
返回Query Set对象的方法有:
* all()
* filter()
* exclude()
* order_by()
* reverse()
* dictinct()
特殊的QuerySet:
* values() 返回一个可迭代的字典序列
* values_list() 返回一个可迭代的元祖序列
返回具体对象的:
* get()
* first()
* last()
返回布尔值的方法有:
* existe()
返回数学的方法有:
* count( )
defer : 映射中排除某列数据
only : 仅取某个列中的数据
34、select_related和prefetch_related的区别?
select_related通过多表join关联查询,一次性获得所有数据,通过降低数据库查询次数来提升性能,但关联表不能太多,因为join操作本来就比较消耗性能
prefetch_related()的解决方法是,分别查询每个表,然后用Python处理他们之间的关系!
都是为了减少SQL查询的数量
35、filter和exclude的区别?
filter是查询满足条件的数据
exclude是查询不满足添加的数据
# 1.使用execute执行自定义SQL
# from django.db import connection, connections
# cursor = connection.cursor() # cursor =
connections[‘default‘].cursor()
# cursor.execute("""SELECT * from auth_user where id =
%s""", [1])
# row = cursor.fetchone()
# 2.使用extra方法
# extra(self, select=None,
where=None, params=None, tables=None, order_by=None, select_params=None)
# Entry.objects.extra(select={‘new_id‘: "select
col from sometable where othercol > %s"}, select_params=(1,))
# Entry.objects.extra(where=[‘headline=%s‘],
params=[‘Lennon‘])
# Entry.objects.extra(where=["foo=‘a‘ OR bar =
‘a‘", "baz = ‘a‘"])
# Entry.objects.extra(select={‘new_id‘: "select
id from tb where id > %s"}, select_params=(1,), order_by=[‘-nid‘])
# 3.使用raw方法
# 解释:执行原始sql并返回模型
# 说明:依赖model多用于查询
# 用法:
# book =
Book.objects.raw("select * from hello_book")
# for item in book:
# print(item.title)123456789101112131415161718192021
class
Router1:
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db
== ‘db1‘ and app_label == ‘app02‘:
return True
elif db
== ‘default‘ and app_label == ‘app01‘:
return
True
else:
return
False
# 如果返回None,那么表示交给后续的router,如果后续没有router,则相当于返回True
def db_for_read(self, model, **hints):
if model._meta.app_label
== ‘app01‘:
return
‘default‘
else:
return
‘db1‘
def db_for_write(self, model, **hints):
if model._meta.app_label
== ‘app01‘:
return
‘default‘
else:
return
‘db1‘
F:操作数据表中的某列值,F( )允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。
通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交
Q:对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。
2、基于Python下的web框架之中最具有代表性的一个——Django
标签:ken 表数据 完整性 登录 元数据 有一个 cap nal 分组
原文地址:https://www.cnblogs.com/qingaoaoo/p/12397208.html