python后端面试第四部分:django框架--长期维护

##################    Python语法基础        #######################

 django框架部分

1,流程

2,admin

3,视图

3,路由

4,csrf

3.csrf是什么?django是如何防范的?

django请求的生命周期,

浏览器-wsgi-中间件-路由-视图-然后处理数据等,返回数据

3,什么是wsgi?是一个协议,还有一些需要理解,

4,中间件是什么?在视图之前定制一些操作,

5,使用中间件做什么?做过什么认证,权限,跨域,等,都是

6,中间件有多少个方法?5个,

7,CBV和FBV是什么?以及优缺点,

8,restful协议,

9,rest framework,这是帮助我们快速写api,没有这个一样做,

10,视图常见的继承:

viewset,这个只能实现简单的,复杂的还是要自己写,

11,如何实现访问频率控制?

根据ip,获取到ip,然后加上时间戳,

192.168.100.128:[时间戳]

访问一次时间戳就加上一个,时间戳只保存3个,假设需求是一分钟访问3次,

这就是原理,

每一个人保持一个列表,假设是3,下次访问的时候先剔除不合适的,然后根据列表的长度判断是否可以访问,

这种实际做不了,因为ip是可以换的,可以使用代理ip,

这种只能防止小白,不能防止做IT,也就是不能防止匿名用户,但是可以防登陆用户,因为用户有用户名,这是唯一的,但是账户多就没有办法了,

这个实现原理也是rest framework里面频率组件实现原理,

    你看过django的admin源码么;看过flask的源码么;你如何理解开源;

    MVC / MTV;

    缓存怎么用;

    中间件是干嘛的;

    CSRF是什么,django是如何避免的;XSS呢;

    如果你来设计login,简单的说一下思路;

    session和cookie的联系与区别;session为什么说是安全的;

    uWSGI和Nginx的作用;

    (我发现基本不问django实现细节相关的东西。。或者问也问的很少,哎,之前准备的方向完全错了)

说一下浏览器从输入url到页面渲染的过程,越详细越好;

了解web安全吗?说一下XSS原理,然后又问了很多;

说一下CSRF的理解;

session和cookie的区别;

请说一说ORM实现原理

ORM使用了Python的属性描述符协议实现,通过另外一个类来描述类变量的属性类型, 再给这个属性进行赋值时(对应数据库中的字段名称)会调用__set__方法,访问属性则会调用__get__方法删除则调用__delete__方法。

3.csrf是什么?如何防范?

csrf成为跨站伪造请求, 利用用户信任过的网站去执行一些恶意的操作

如何防范:

1.检查Referer字段, 严格要求该字段只来自于信任的URL

2.添加校验token,将token值附加在表单中,攻击者是无法获取这个字, 服务端进行检查发现该值为空时将会拒绝服务。

 什么是wsgi?
Python Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。
http://python.jobbole.com/88653/
26. django请求的生命周期?
a. wsgi, 创建socket服务端,用于接收用户请求并对请求进行初次封装。
b. 中间件,对所有请求到来之前,响应之前定制一些操作。
c. 路由匹配,在url和视图函数对应关系中,根据当前请求url找到相应的函数。
d. 执行视图函数,业务处理【通过ORM去数据库中获取数据,再去拿到模板,然后将数据和模板进行渲染】
e. 再经过所有中间件。
f. 通过wsgi将响应返回给用户。 
27. 列举django的内置组件?

form/modelform/admin
28. 列举django中间件的5个方法?以及django中间件的应用场景?
中间件中方法?5个方法,分别是:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
1 请求先执行所有中间件的process_request,然后做路由匹配,找到函数不执行。
2 再执行所有的process_view,在执行视图函数。
3 再执行process_response
4 如果程序报错执行process_exception
5 如果程序有render方法则执行process_template_response
29. 简述什么是FBV和CBV?
1 FBV方式请求的过程
用户发送url请求,Django会依次遍历路由映射表中的所有记录,一旦路由映射表其中的一条匹配成功了,
就执行视图函数中对应的函数名,这是fbv的执行流程

2 CBV方式请求的过程
当服务端使用CBV模式的时候,用户发给服务端的请求包含url和method,这两个信息都是字符串类型

服务端通过路由映射表匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方法并执行

类中的方法执行完毕之后,会把客户端想要的数据返回给dispatch方法,由dispatch方法把数据返回经客户端

把上面的例子中的视图函数修改成如下:
from django.views import View

class CBV(View):
def dispatch(self, request, *args, **kwargs):
print("dispatch......")
res=super(CBV,self).dispatch(request,*args,**kwargs)
return res

def get(self,request):
return render(request, "cbv.html")

def post(self,request):
return HttpResponse("cbv.get")

3 FBV和CBV的区别?
- 没什么区别,因为他们的本质都是函数。CBV的.as_view()返回的view函数,view函数中调用类的dispatch方法,在dispatch方法中通过反射执行get/post/delete/put等方法。
- CBV比较简洁,GET/POST等业务功能分别放在不同get/post函数中。FBV自己做判断进行区分。

http://www.cnblogs.com/renpingsheng/p/7534897.html
30. django的request对象是在什么时候创建的?
当请求一个页面时, Django会建立一个包含请求元数据的 HttpRequest 对象. 当Django 加载对应的视图时, HttpRequest对象将作为视图函数的第一个参数. 每个视图会返回一个HttpResponse对象.
https://blog.csdn.net/mbl114/article/details/78090773
31. 如何给CBV的程序添加装饰器?
- 装饰器
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('...')

- csrf的装饰器要加到dispath
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect


class UserView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return HttpResponse('...')


from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect

@method_decorator(csrf_exempt,name='dispatch')
class UserView(View):
def dispatch(self, request, *args, **kwargs):
return HttpResponse('...')
32. 列举django orm 中所有的方法(QuerySet对象的所有方法)
返回QuerySet对象的方法有:
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet:
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元组序列
返回具体对象的:
get()
first()
last()
返回布尔值的方法有:
exists()
返回数字的方法有:
count()
33. only和defer的区别?
def defer(self, *fields):
models.UserInfo.objects.defer('username','id')

models.UserInfo.objects.filter(...).defer('username','id')
#映射中排除某列数据

def only(self, *fields):
#仅取某个表中的数据
models.UserInfo.objects.only('username','id')

models.UserInfo.objects.filter(...).only('username','id')
34. select_related和prefetch_related的区别?
title = models.CharField(max_length=32)

class UserInfo(models.Model):
name = models.CharField(max_length=32)
email = models.CharField(max_length=32)
ut = models.ForeignKey(to='UserType')
ut = models.ForeignKey(to='UserType')
ut = models.ForeignKey(to='UserType')
ut = models.ForeignKey(to='UserType')


# 1次SQL
# select * from userinfo
objs = UserInfo.obejcts.all()
for item in objs:
print(item.name)

# n+1次SQL
# select * from userinfo
objs = UserInfo.obejcts.all()
for item in objs:
# select * from usertype where id = item.id 
print(item.name,item.ut.title)

示例1: 
.select_related()
# 1次SQL
# select * from userinfo inner join usertype on userinfo.ut_id = usertype.id 
objs = UserInfo.obejcts.all().select_related('ut')
for item in objs:
print(item.name,item.ut.title)
示例2:
.prefetch_related()
# select * from userinfo where id <= 8
# 计算:[1,2]
# select * from usertype where id in [1,2]
objs = UserInfo.obejcts.filter(id__lte=8).prefetch_related('ut')
for obj in objs:
print(obj.name,obj.ut.title)
两个函数的作用都是减少查询次数
35. filter和exclude的区别?
def filter(self, *args, **kwargs)
# 条件查询(符合条件)
# 条件可以是:参数,字典,Q

def exclude(self, *args, **kwargs)
# 条件查询(排除条件)
# 条件可以是:参数,字典,Q
36. 列举django orm中三种能写sql语句的方法。
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)
https://www.cnblogs.com/413xiaol/p/6504856.html
37. django orm 中如何设置读写分离?
class Router1:
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
All non-auth models end up in this pool.
"""
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):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'

def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'
38. F和Q的作用?
F:
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
修改操作也可以使用F函数,比如将每一本书的价格提高30元

例:把所有书名后面加上(第一版)
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.all().update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")")))
Q:
Q(条件1) | Q(条件2) 或
Q(条件1) & Q(条件2) 且
Q(条件1) & ~Q(条件2) 非
39. values和values_list的区别?
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元组序列
40. 如何使用django orm批量创建数据?
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)
41. django的Form和ModeForm的作用?
- 作用:
- 对用户请求数据格式进行校验
- 自动生成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 
- 应用:只要是客户端向服务端发送表单数据时,都可以进行使用,如:用户登录注册
42. django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
方式一:重写构造方法,在构造方法中重新去数据库获取值
class UserForm(Form):
name = fields.CharField(label='用户名',max_length=32)
email = fields.EmailField(label='邮箱')
ut_id = fields.ChoiceField(
# choices=[(1,'二B用户'),(2,'山炮用户')]
choices=[]
)

def __init__(self,*args,**kwargs):
super(UserForm,self).__init__(*args,**kwargs)

self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title')
方式二: ModelChoiceField字段
from django.forms import Form
from django.forms import fields
from django.forms.models import ModelChoiceField
class UserForm(Form):
name = fields.CharField(label='用户名',max_length=32)
email = fields.EmailField(label='邮箱')
ut_id = ModelChoiceField(queryset=models.UserType.objects.all())

依赖:
class UserType(models.Model):
title = models.CharField(max_length=32)

def __str__(self):
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():此值设置,会调用外面的值,可以是一个函数。
44. django中csrf的实现机制?
Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:

1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值

2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性

3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御

具体配置如下:

template中添加{%csrf_token%}标签
https://blog.csdn.net/u012556900/article/details/57412707
45. django如何实现websocket?

https://www.cnblogs.com/huguodong/p/6611602.html
46. 基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
三种方式:
https://www.cnblogs.com/wxp5257/p/7834090.html
47. django中如何实现orm表中添加数据时创建一条日志记录。
LOGGING配置查看翻译的SQL:
在Django的日志设置中,配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}  
http://www.cnblogs.com/owasp/p/5981355.html
48. django缓存如何设置?
三种粒度缓存
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 %}
49. django的缓存能使用redis吗?如果可以的话,如何配置?
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",
},
}
50. django路由系统中name的作用?
简单说,name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。
https://blog.csdn.net/liweiblog/article/details/77599604
51. django的模板中filter和simple_tag的区别?
simple_tag 
  -参数任意,但是不能作为if条件判断的条件
filter 
  -参数最多只能有两个,但是可以作为if条件判断的条件。
http://www.cnblogs.com/cerofang/p/8367588.html
52. django-debug-toolbar的作用?
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。 
包括查看执行的sql语句,db查询次数,request,headers,调试概览等。 
https://blog.csdn.net/weixin_39198406/article/details/78821677
53. django中如何实现单元测试?

https://www.jianshu.com/p/34267dd79ad6
54. 解释orm中 db first 和 code first的含义?
datebase first就是代表数据库优先,那么前提就是先创建数据库。
model first就是代表model优先,那么前提也就是先创建model,然后根据model自动建立数据库。
55. django中如何根据数据库表生成model中的类?

https://jingyan.baidu.com/article/4ae03de3e513d23eff9e6bb7.html
56. 使用orm和原生sql的优缺点?
ORM框架:

  对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。

简述ORM原理:
  让用户不再写SQL语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作!把用户输入的类或对象转换成SQL语句,转换之后通过pymysql执行完成数据库的操作。

ORM的优缺点:

优点: 
  提高开发效率,降低开发成本 
  使开发更加对象化 
  可移植 
  可以很方便地引入数据缓存之类的附加功能 
缺点: 
  在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。就需要写入原生SQL。
57. 简述MVC和MTV
MTV和MVC?

MVC: model view controller 
MTV: model tempalte view 
58. django的contenttype组件的作用?
contenttype是django的一个组件(app),为我们找到django程序中所有app中的所有表并添加到记录中。

可以使用他再加上表中的两个字段实现:一张表和N张表创建FK关系。
- 字段:表名称
- 字段:数据行ID

应用:路飞表结构优惠券和专题课和学位课关联。
http://www.cnblogs.com/iyouyue/p/8810464.html
59. 谈谈你对restfull 规范的认识?
- restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。
- 最显著的特点:
restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put和patch修改数据、delete删除数据。
no rest: 给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/
- 当然,还有协议其他的,比如:
- 版本,来控制让程序有多个版本共存的情况,版本可以放在 url、请求头(accept/自定义)、GET参数
- 状态码,200/300/400/500
- url中尽量使用名词,restful也可以称为“面向资源编程”
- api标示:
api.YueNet.com
www.YueNet.com/api/

https
- 域名 
- api.oldboy.com
- www.oldboy.com/api
- 版本:
- www.oldboy.com/api/v1

- URL资源,名词
- www.oldboy.com/api/v1/student

- 请求方式:
- GET/POST/PUT/DELETE/PATCH/OPTIONS/HEADERS/TRACE
- 返回值:
- www.oldboy.com/api/v1/student/ -> 结果集
- www.oldboy.com/api/v1/student/1/ -> 单个对象
- URL添加条件
- www.oldboy.com/api/v1/student?page=11&size=9
- 状态码: 
- 200
- 300
- 301
- 302
- 400
- 403
- 404
- 500
- 错误信息
{
code:1000,
meg:'xxxx'
}
- hyperlink
{
id:1
name: ‘xiangl’,
type: http://www.xxx.com/api/v1/type/1/
}
60. 接口的幂等性是什么意思?
一个接口通过首先进行1次访问,然后对该接口进行N次相同访问的时候,对访问对象不造成影响,那么就认为接口具有幂等性。
比如:
GET, 第一次获取数据、第二次也是获取结果,幂等。
POST, 第一次新增数据,第二次也会再次新增,非幂等。
PUT, 第一次更新数据,第二次不会再次更新,幂等。
PATCH,第一次更新数据,第二次可能再次更新,非幂等。
DELTE,第一次删除数据,第二次不会再次删除,幂等。
61. 什么是RPC?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
62. Http和Https的区别?
  超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

  为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
https://www.cnblogs.com/wqhwe/p/5407468.html
63. 为什么要使用django rest framework框架?
  1.客户端-服务端分离

   优点:提高用户界面的便携性,通过简化服务器提高可伸缩性....

  2.无状态(Stateless):从客户端的每个请求要包含服务器所需要的所有信息

   优点:提高可见性(可以单独考虑每个请求),提高了可靠性(更容易从局部故障中修复),提高可扩展性(降低了服务器资源使用)

  3.缓存(Cachable):服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求

   优点:减少交互次数,减少交互的平均延迟

  4.统一接口

   优点:提高交互的可见性,鼓励单独改善组件

  5.支持按需代码(Code-On-Demand 可选)

  优点:提高可扩展性
https://www.cnblogs.com/vipchenwei/p/7867028.html
64. django rest framework框架中都有那些组件?
- 路由,自动帮助开发者快速为一个视图创建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
- 定义方法
- 请求数据格式校验

- 渲染器
65. django rest framework框架中的视图都可以继承哪些类?
a. 继承 APIView
这个类属于rest framework中顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操作都需要手动去完成,比较原始。



class GenericAPIView(APIView)

def post(...):
pass 

b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
如果继承它之后,路由中的as_view需要填写对应关系 .as_view({'get':'list','post':'create'})
在内部也帮助我们提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer

注意:要设置queryset字段,否则会跑出断言的异常。
# 只提供增加功能
class TestView(GenericViewSet):
serializer_class = XXXXXXX

def create(self,*args,**kwargs):
pass # 获取数据并对数据进行操作

c. 继承 
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet

对数据库和分页等操作不用我们在编写,只需要继承相关类即可。

示例:只提供增加功能
class TestView(mixins.CreateModelMixin,GenericViewSet):
serializer_class = XXXXXXX
http://www.cnblogs.com/iyouyue/p/8798572.html#_label3
66. 简述 django rest framework框架的认证流程。
- 如何编写?写类并实现authticate
- 方法中可以定义三种返回值:
- (user,auth),认证成功
- None , 匿名用户
- 异常 ,认证失败
- 流程:
- dispatch 
- 再去request中进行认证处理
https://www.cnblogs.com/haiyan123/p/8419872.html
67. django rest framework如何实现的用户访问频率控制?
a. 基于用户IP限制访问频率
b. 基于用户IP显示访问频率(利于Django缓存) 
c. view中限制请求频率
d. 匿名时用IP限制+登录时用Token限制
e. 全局使用
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'api.utils.throttles.throttles.LuffyAnonRateThrottle',
'api.utils.throttles.throttles.LuffyUserRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '10/day',
'user': '10/day',
'luffy_anon': '10/m',
'luffy_user': '20/m',
},
}
https://www.cnblogs.com/vipchenwei/p/7867028.html

猜你喜欢

转载自www.cnblogs.com/andy0816/p/12228513.html
今日推荐