07-12 django 56-60
______egon新书python全套来袭请看:https://egonlin.com/book.html
56.简述django中间件及其应用场景?
.process_request : 请求进来时,权限认证
.process_view : 路由匹配之后,能够得到视图函数
.process_exception : 异常时执行
.process_template_responseprocess : 模板渲染时执行
.process_response : 请求有响应时执行
57.简述 django FBV 和 CBV?
FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
- .提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- .可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
58.如何给 django CBV 的函数设置添加装饰器?
from django.utils.decorators import method_decorator
1、给方法加:
@method_decorator(check_login)
def post(self, request):
...
2、给dispatch加:
@method_decorator(check_login)
def dispatch(self, request, *args, **kwargs):
...
3、给类加:
@method_decorator(check_login, name="get")
@method_decorator(check_login, name="post")
class HomeView(View):
...
59.django 如何连接多个数据库并实现读写分离?
在配置文件中增加slave数据库的配置
在Django的配置文件settings.py中,DATABASES中添加代码如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 主服务器的运行ip
'PORT': 3306, # 主服务器的运行port
'USER': 'django', # 主服务器的用户名
'PASSWORD': 'django', # 主服务器的密码
'NAME': 'djangobase' # 数据表名
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 8306,
'USER': 'django_slave',
'PASSWORD': 'django_slave',
'NAME': 'djangobase_slave'
}
}
创建数据库操作的路由分类
在项目的utils中创建db_router.py文件,并在该文件中定义一个db类,用来进行读写分离
class MasterSlaveDBRouter(object):
"""数据库主从读写分离路由"""
def db_for_read(self, model, **hints):
"""读数据库"""
return "slave"
def db_for_write(self, model, **hints):
"""写数据库"""
return "default"
def allow_relation(self, obj1, obj2, **hints):
"""是否运行关联操作"""
return True
配置读写分离路由
在配置文件中增加:
#配置读写分离
DATABASE_ROUTERS = ['项目名.utils.db_router."自定义的类名称"']
60.列举 django orm 中你了解的所有方法?
# QuerySet对象的所有方法
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象。获取不到返回None
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个。
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序
<6> reverse(): 对查询结果反向排序
<8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<9> first(): 返回第一条记录
<10> last(): 返回最后一条记录
<11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的
并不是一系 model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<14> distinct(): 从返回结果中剔除重复纪录