Django⾯试题(附带答案)
总结的⼀些Django中会问的问题,希望对你们有⽤。
1、 Django的⽣命周期
当⽤户在浏览器输⼊url时,浏览器会⽣成请求头和请求体发送给服务端,url经过Django中的wsgi时请求对象创建完成,经过django的中间件,然后到路由系统匹配路由,匹配成功后⾛到相对应的views函数,视图函数执⾏相关的逻辑代码返回执⾏结果,Django把客户端想要的数据作为⼀个字符串返回给客户端,客户端接收数据,渲染到页⾯展现给⽤户
2、内置组件
Admin、from、modelfrom、model
3、缓存⽅案
设置缓存到内存
缓存到redis,配置redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://39.96.61.39:6379",
'PASSWORD':'19990104.Yu',
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
单个view缓存
视图导⼊from django.views.decorators.cache import cache_page
在需要进⾏缓存的视图函数上添加如下装饰器即可:
@cache_page(60 * 2)#20分钟
底层缓存API
视图导⼊ ache import cache
模板⽚段缓存
使⽤cache标签进⾏缓存
在HTML⽂件中添加:
{%load cache%}
{%cache 60 缓存名字 %}
4、 FBV和CBV
django admin 自定义页面FBV:基于函数的视图函数
CBV:基于类的视图函数
5、 session和cookie
区别:
cookie数据存放在客户的浏览器上,session数据放在服务器上
cookie不是很安全,别⼈可以分析存放在本地的COOKIE并进⾏COOKIE欺骗
考虑到安全应当使⽤session。
session会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能考虑到减轻服务器性能⽅⾯,应当使⽤COOKIE
单个cookie保存的数据不能超过4K,很多浏览器都限制⼀个站点最多保存20个cookie
建议:将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中
Cookie代码
HttpCookie cookie = new HttpCookie("MyCook");//初使化并设置Cookie的名称
DateTime dt = DateTime.Now;
TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//过期时间为1分钟
cookie.Expires = dt.Add(ts);//设置过期时间
cookie.Values.Add("userid", "value");
cookie.Values.Add("userid2", "value2");
Response.AppendCookie(cookie);
6、 HTTP请求常见的⽅式
1、opions 返回服务器针对特定资源所⽀持的HTML请求⽅法或web服务器发送测试服务器功能(允许客户端查看服务器性能)
2、Get 向特定资源发出请求(请求指定页⾯信息,并返回实体主体)
3、Post 向指定资源提交数据进⾏处理请求(提交表单、上传⽂件),⼜可能导致新的资源的建⽴或原有资源的修改
4、Put 向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定⽂档的内容)
5、Head 与服务器索与get请求⼀致的相应,响应体不会返回,获取包含在⼩消息头中的原信息(与get请求类似,返回的响应中没有具体内容,⽤于获取报头)
6、Delete 请求服务器删除request-URL所标⽰的资源(请求服务器删除页⾯)
7、Trace 回显服务器收到的请求,⽤于测试和诊断
8、Connect HTTP/1.1协议中能够将连接改为管道⽅式的代理服务器
7、 MVC和MTV模式
MTV:Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页⾯展⽰给⽤户
View(视图):负责业务逻辑,并在适当的时候调⽤Model和Template
MVC: 所谓MVC就是把web应⽤分为模型(M),控制器(C),视图(V)三层;他们之间以⼀种插件似的,松耦合的⽅式连接在⼀起。模型负责业务对象与数据库的对象(ORM),视图负责与⽤户的交互(页⾯),控制器(C)接受⽤户的输⼊调⽤模型和视图完成⽤户的请求。
8、 ORM
对象关系映射
优点:
1、ORM使得我们的通⽤数据库交互变得简单易⾏,并且完全不⽤考虑开始的SQL语句。快速开发,由此⽽来。
2、可以避免⼀些新⼿程序猿写sql语句带来的性能效率和安全问题。
缺点:
1、性能有所牺牲,不过现在的各种ORM框架都在尝试使⽤各种⽅法来减少这个问题(LazyLoad,Cache),效果还是很显著的。
2、对于个别的负责查询,ORM仍然⼒不从⼼。为了解决这个问题,ORm框架⼀般也提供了直接写原⽣sql的⽅式。
9、中间件的作⽤
中间件是介于request与response处理之间的⼀道处理过程,能在全局上改变django的输⼊与输出
10、中间件的4种⽅法及应⽤场景(⾃定义中间件必须继承MiddlewareMixin)
导包、from django.utils.deprecation import MiddlewareMixin
4种⽅法:
process_request
process_view
process_exception views中出现错误执⾏该⽅法
process_response
process_template_responseprocess 当函数中有render⽅法会执⾏该⽅法
11、什么是wsgi,uwsgi,uWSGI?
WSGI:
web服务器⽹关接⼝,是⼀套协议。⽤于接收⽤户请求并将请求进⾏初次封装,然后将请求交给web框架实现wsgi协议的模块:
1.wsgiref,本质上就是编写⼀个socket服务端,⽤于接收⽤户请求(django)
2.werkzeug,本质上就是编写⼀个socket服务端,⽤于接收⽤户请求(flask)
uwsgi:
与WSGI⼀样是⼀种通信协议,它是uWSGI服务器的独占协议,⽤于定义传输信息的类型
uWSGI:
是⼀个web服务器,实现了WSGI协议,uWSGI协议,http协议
12、ORM中的⽅法
1. models.Book.objects.all() # 获取到所有的书籍对象,结果是对象列表
2. models.(条件) # 获取符合条件的对象
3. models.Book.objects.filter(条件) # 筛选所有符合条件的,结果是对象列表
4. models.lude(条件) # 筛选出所有不符合条件的,结果是对象列表
5. models.Book.objects.all().values( ) # 字典列表,[ {id:1,name:20} , {id:2,name:18} ]
values(‘id’)括号内不指定时显⽰全部,如指定则只显⽰指定的,[ {id:1} , {id:2,} ]
6. models.Book.objects.all().values_list( ) # 元组列表,[ (1,20) , (2,18) ]同上,指定时显⽰指定内容
7. models.Book.objects.all().order_by(‘id’) # 按照id升序就⾏排列
models.Book.objects.all().order_by(‘-id’) # 按照id降序就⾏排列
models.Book.objects.all().order_by(‘age’ , ‘-id’) # 先按age升序,age相同的按id进⾏降序排列
8. models.Book.objects.all().order_by(‘id’).reverse() # 对结果反转; 注意reverse前必须排序,
否则reverse⽆效; 或在model.py⽂件中Book类中的Meta中指定ordering=(‘id’ , )注意逗号必须有
9. distinct(): # 去重,当获取到的结果Queryset列表中同⼀对象出现多次时去重,只留⼀个
10. models.Book.objects.all().count() # 计数,可统计结果个数,如对Queryset内元素数进⾏统计.
11. models.Book.objects.all().first() # 获取结果中的第⼀条,即使前⾯结果列表为空,也不会报错
12. models.Book.objects.filter().last() # 获取结果中的最后⼀条
返回对象列表(Queryset)的⽅法有:
all() filter() ordey_by() exclude() values() values_list() reverse() distinct()
返回单个对象的⽅法有:
first() last() get() create()创建⼀个对象,且返回刚创建的对象
判断布尔值的有:
exists()
返回数字的有:
count()
13、filter和exclude的区别
filter返回满⾜条件的数据
exclude返回不满⾜条件的数据
14、ORM中三种能写sql语句的⽅法
1、execute 直接访问数据库,避开模型层
2、extra
3、raw for p in Person.objects.raw('SELECT * FROM myapp_person'):
print(p)
15、ORM批量处理数据
插⼊数据:创建⼀个对象列表,然后调⽤bulk_create⽅法,⼀次将列表中的数据插⼊到数据库中。
product_list_to_insert = list()
for x in range(10):
product_list_to_insert.append(Product(name='product name ' + str(x), price=x))
Product.objects.bulk_create(product_list_to_insert)
更新数据:先进⾏数据过滤,然后再调⽤update⽅法进⾏⼀次性地更新
Product.objects.filter(name__contains='name').update(name='new name')
删除数据:先是进⾏数据过滤,然后再调⽤delete⽅法进⾏⼀次性删除
Product.objects.filter(name__contains='name query').delete()
16、CSRF实现机制
1)启⽤中间件
2)post请求
3)验证码
4)表单中添加{% csrf_token%}标签
17、Django中提供了runserver为什么不能⽤来部署项⽬(runserver与uWSGI的区别)
1.runserver⽅法是调试 Django 时经常⽤到的运⾏⽅式,它使⽤Django⾃带的
WSGI Server 运⾏,主要在测试和开发中使⽤,并且 runserver 开启的⽅式也是单进程。
2.uWSGI是⼀个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是⼀种通信协议,⽽uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。
uWSGI具有超快的性能、低内存占⽤和多app管理等优点,并且搭配着Nginx就是⼀个⽣产环境了,能够将⽤户访问请求与应⽤ app 隔离开,实现真正的署。
相⽐来讲,⽀持的并发量更⾼,⽅便管理多进程,发挥多核的优势,提升性能。
18、Django中如何实现websocket
1、简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃。官⽅推荐⼤家使⽤channels。
2、配置
1、需要在seting.py⾥配置,将我们的channels加⼊INSTALLED_APP⾥。
19、Django的跨域问题
1、为什么有跨域?
1、浏览器的同源策略(从⼀个域上加载的脚本不允许访问另外⼀个域的⽂档属性。)
2、解决跨域问题
1、前端设置代理进⾏访问
2、settings中配置django-cors-headers==2.0.1
INSTALLED_APPS中添加 ‘corsheaders’
'corsheaders.middleware.CorsMiddleware',#放在session中间件下⾯
添加代码
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
#允许所有的请求头
CORS_ALLOW_HEADERS = ('*')
20、model继承有⼏种⽅式,分别是什么?
抽象基类(Abstract base classes)
多表继承(Multi-table inheritance)
Meta inheritance 当⼀个⼦类没有声明⾃⼰的Meta类时,它会继承基类的 Meta 类,如果⼦类想扩展基类的 Meta 类,它可以继承基类的Meta类,然后再进⾏扩展。
21、values和values_list()的区别
values : 取字典的queryset
values_list : 取元组的queryset
22、class Meta中的原信息字段有哪些?
1、app_label 应⽤场景:模型类不在默认的应⽤程序包下的models.py⽂件中,这时候你需要指定你这个模型类是那个应⽤程序的。
2、db_table 应⽤场景:⽤于指定⾃定义数据库表名的
3、db_tablespace 应⽤场景:通过db_tablespace来指定这个模型对应的数据库表放在哪个数据库表空间。
4、verbose_name 应⽤场景:给你的模型类起⼀个更可读的名字:
5、verbose_name_plural 应⽤场景:模型的复数形式是什么
6、ordering 应⽤场景:象返回的记录结果集是按照哪个字段排序的
23、视图函数中,常⽤的验证装饰器有哪些?
24、web框架的本质
socket服务端
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论