1 列举Http请求中常见的请求方式
HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动做”),来代表Request-URL指定的资源不一样的操做方式
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
2)
HTTP服务器至少应该实现GET和HEAD/POST方法,其余方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
GET css |
向特定的路径资源发出请求html
注意:GET方法不该当被用于产生“反作用”的操做中,例如在WebApplication中,其中一个缘由是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url前端
|
POSTpython |
向指定路径资源提交数据进行处理请求(通常用于提交表单或者上传文件)ios
数据被包含在请求体中,POST请求可能会致使新的资源的创建和/或已有资源的修改。Loadrunner中对应POST请求函数:web_submit_data,web_submit_formnginx
|
OPTIONS web |
返回服务器针对特定资源所支持的HTTP请求方法面试
容许客户端查看服务器的性能,也能够利用向web服务器发送‘*’的请求来测试服务器的功能性ajax
|
HEAD算法 |
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回
这一方法能够再没必要传输整个响应内容的状况下,就能够获取包含在响应小消息头中的元信息。
|
PUT |
从客户端向服务器传送的数据取代指定的文档的内容
|
DELETE |
请求服务器删除指定的页面
|
TRACE |
回回显服务器收到的请求,主要用于测试或诊断
|
CONNECT |
HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务
|
2 谈谈你对HTTP协议的认识。1.1 长链接
HTTP是一个属于应用层的面向对象的协议
HTTP协议工做于客户端-服务端架构为上。浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
双方创建通讯的顺序,以及Web页面显示须要 处理的步骤,等等。像这样把与互联网相关联的协议集合起来总称为 TCP/IP。而http协议是基于TCP/IP协议之上的应用层协议。
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通讯状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不作持久化处理。
使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议自己并不保留以前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特地把HTTP协议设计成 如此简单的。但是,随着Web的不断发展,因无状态而致使业务处理变得棘手 的状况增多了。好比,用户登陆到一家购物网站,即便他跳转到该站的 其余页面后,也须要能继续保持登陆状态。针对这个实例,网站为了能 够掌握是谁送出的请求,须要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现指望的保持状态功能, 因而引入了Cookie技术。有了Cookie再用HTTP协议通讯,就能够管 理状态了。
3 简述MVC模式和MVT模式
所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式链接在一块儿,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求
MTV
Django的MTV模式本质上和MVC是同样的,也是为了各组件间保持松耦合关系,只是定义上有些许不一样,Django的MTV分别是值:
- M 表明模型(Model): 负责业务对象和数据库的关系映射(ORM)。
- T 表明模板 (Template):负责如何把页面展现给用户(html)。
- V 表明视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层以外,还须要一个URL分发器,它的做用是将一个个URL的页面请求分发给不一样的View处理,View再调用相应的Model和Template,MTV的响应模式以下所示:
通常是用户经过浏览器向咱们的服务器发起一个请求(request),这个请求回去访问视图函数,(若是不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,而后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
4 简述Django请求生命周期
通常是用户经过浏览器向咱们的服务器发起一个请求(request),这个请求回去访问视图函数,(若是不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,而后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
#1.wsgi,请求封装后交给web框架 (Flask、Django)
#2.中间件,对请求进行校验或在请求对象中添加其余相关数据,例如:csrf、request.session -
#3.路由匹配 根据浏览器发送的不一样url去匹配不一样的视图函数
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 -
#5.中间件,对响应的数据进行处理。
#6.wsgi,将响应的内容发送给浏览器。
5 简述什么是FBV和CBV
FBV(function base views)就是在视图函面使用函数处理请求
CBV(class base views)就是在视图里面使用类处理请求
6 谈一谈你对ORM的理解
ORM是“对象-关系-映射”的简称。
MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不须要依赖于特定的数据库,经过简单的配置就能够轻松更换数据库,这极大的减轻了开发人员的工做量,不须要面对因数据库变动而致使的无效劳动
7 rest_framework 认证组件的流程
#4.认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻
8 什么是中间件并简述其做用
中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每一个中间件组件都负责作一些特定的功能。
中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,而且在全局上改变django的输入与输出。
9 django 中间件生命周期
请求过来:
中间件:拦截一部分请求;好比验证session, 没有登陆的 请求一些页面,跳转至登陆页;(图片为中间件的请求过程.)再到 urls ,分发请求到views 视图 ,经过 CBV(dispatch反射) 和 FBV 的 get 请求 讲 template 页面渲染返回给用户;渲染以前 能够从数据库拿出数据,放到render 的参数里面传递过去, locals() 表示 把全部参数传递还能够 实例化 其余 form 类,并渲染给前端
10 django中怎么写原生SQL
列举django orm中三种能写sql语句的方法
使用extra:查询人民邮电出版社出版而且价格大于50元的书籍
Book.objects.filter(publisher__name='人民邮电出版社').extra(where=['price>50'])
使用raw
books=Book.objects.raw('select * from hello_book')
for book in books:
print book
自定义sql
from django.db import connection
cursor = connection.cursor()
cursor.execute("insert into hello_author(name) VALUES ('郭敬明')")
cursor.execute("update hello_author set name='韩寒' WHERE name='郭敬明'")
cursor.execute("delete from hello_author where name='韩寒'")
cursor.execute("select * from hello_author")
cursor.fetchone()
cursor.fetchall()
11 如何使用django orm批量建立数据
使用django.db.models.query.QuerySet.bulk_create()批量建立对象,减小SQL查询次数。改进以下:
querysetlist=[]
for i in resultlist:
querysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)
12 命令migrate 和makemigrations的差异
生成迁移文件
执行迁移
13 视图函数中,接收的请求对象经常使用方法和属性有哪些
- method属性,获取请求中使用的HTTP方式的字符串表示。全大写表示
- GET属性,获取HTTP GET方式请求传参,的参数(字典类型)
如:http://127.0.0.1:8000/bug/articles/?mch=123 & mim=456
复制代码
from django.shortcuts import render,HttpResponse
def special(request):
print(request.GET)
return render(request,'index.html') #向用户显示一个html页面
#返回:
#<QueryDict: {' mim': ['456'], 'mch': ['123 ']}>
# POST: 包含全部HTTP POST参数的类字典对象
#
# 服务器收到空的POST请求的状况也是可能发生的,也就是说,表单form经过
# HTTP POST方法提交请求,可是表单中可能没有数据,所以不能使用
# if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"
COOKIES: 包含全部cookies的标准Python字典对象;keys和values都是字符串。
#
# FILES: 包含全部上传文件的类字典对象;FILES中的每个Key都是<input type="file" name="" />标签中name属性的值,FILES中的每个value同时也是一个标准的python字典对象,包含下面三个Keys:
#
# filename: 上传文件名,用字符串表示
# content_type: 上传文件的Content Type
# content: 上传文件的原始内容
#
#
# user: 是一个django.contrib.auth.models.User对象,表明当前登录的用户。若是访问用户当前
# 没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
# 能够经过user的is_authenticated()方法来辨别用户是否登录:
# if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
# 时该属性才可用
#
# session: 惟一可读写的属性,表明当前会话的字典对象;本身有激活Django中的session支持时该属性才可用。
get_full_path()方法,获取HTTP GET方式请求传参,的URL地址
14 经常使用视图响应的方式是什么?
视图的响应返回使用HttpResponse
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
通常不用这种方式,我习惯使用:
response = HttpResponse(‘language python’)
response.status_code = 400
response[‘languaget’] = ‘Python’
return response
返回json数据,可使用JsonResponse来构造响应对象
帮助咱们将数据转换为json字符串
设置响应头Content-Type为 application/json
例子:from django.http import JsonResponse
def demo_view(request):
return JsonResponse({‘city’: ‘beijing’, ‘subject’: ‘python’})
redirect重定向
咱们也能够将返回的结果重定向到另外一个页面或接口,
例子:from django.shortcuts import redirect
def demo_view(request):
return redirect(‘/index.html’)
15 HTTP响应常见状态码分类
16 路由匹配原则是什么?
一、关于正则匹配优先级
在url匹配列表中,若是第一条和第二条同时知足匹配规则,则优先匹配第一条。
在url匹配列表中,若是第一条为正则模糊匹配,第二条为精确匹配,则优先匹配第一条
17 缓存系统类型有哪些
# 全站缓存
MIDDLEWARE_CLASSES = (
‘django.middleware.cache.UpdateCacheMiddleware’, #第一
'django.middleware.common.CommonMiddleware',
‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
)
# 视图缓存
from django.views.decorators.cache import cache_page
import time
@cache_page(15) #超时时间为15秒
def index(request):
t=time.time() #获取当前时间
return render(request,"index.html",locals())
# 模板缓存
{% load cache %}
<h3 style="color: green">不缓存:-----{{ t }}</h3>
{% cache 2 'name' %} # 存的key
<h3>缓存:-----:{{ t }}</h3>
{% endcache %}
18 解决跨域的经常使用方式是什么?
跨域是指一个域下的文档或脚本试图去请求另外一个域下的资源,这里跨域是广义的。
广义的跨域:
1.) 资源跳转: A连接、重定向、表单提交
2.) 资源嵌入: link script img frame等dom标签,还有样式中background:url()、@font-face()等文件外链
3.) 脚本请求: js发起的ajax请求、dom和js对象的跨域操做等
1.2那么是什么同源策略呢?
同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,若是缺乏了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即使两个不一样的域名指向同一个ip地址,也非同源。
同源策略限制如下几种行为: 1.) Cookie、LocalStorage 和 IndexDB 没法读取 2.) DOM 和 Js对象没法得到 3.) AJAX 请求不能发送
2、从安全性而言选择那种跨域方式最好,为何?
通常最安全的是WINDOW.NAME,由于iframe会销毁
3、JSONP的缺点
jsonp有个缺陷就是只能get
并且会把请求的内容发送到url中致使安全性极低
#跨域:
# 浏览器从一个域名的网页去请求另外一个域名的资源时,浏览器处于安全的考虑,不容许不一样源的请求
#同源策略:
# 协议相同
# 域名相同
# 端口相同
#处理方法:
# 1.经过JSONP跨域
# JSON是一种数据交换格式
# JSONP是一种非官方的跨域数据交互协议
# jsonp是包含在函数调用中的json
# script标签不受同源策略的影响,手动建立一个script标签,传递URL,同时传入一个回调函数的名字
# 服务器获得名字后,返回数据时会用这个函数名来包裹住数据,客户端获取到数据以后,当即把script标签删掉
# 2.cors:跨域资源共享
# 使用自定义的HTTP头部容许浏览器和服务器相互通讯
# 1.若是是简单请求,直接设置容许访问的域名:
# 容许你的域名来获取个人数据
# response['Access-Control-Allow-Origin'] = "*"
# 2.若是是复杂请求,首先会发送options请求作预检,而后再发送真正的PUT/POST....请求
# 所以若是复杂请求是PUT等请求,则服务端须要设置容许某请求
# 若是复杂请求设置了请求头,则服务端须要设置容许某请求头
#简单请求:
# 一次请求
#非简单请求:
# 两次请求,在发送数据以前会先发一次请求用于作“预检”,
# 只有“预检”经过后才再发送一次请求用于数据传输。
#只要同时知足如下两大条件,就属于简单请求。
# (1) 请求方法是如下三种方法之一:HEAD GET POST
# (2)HTTP的头信息不超出如下几种字段:
# Accept
# Accept-Language
# Content-Language
# Last-Event-ID
# Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、 text/plain
#JSONP和CORS:
# 1.JSONP只能实现GET请求,而CORS支持全部类型的HTTP请求
# 2.jsonp须要client和server端的相互配合
# 3.cors在client端无需设置,server端须要针对不一样的请求,来作head头的处理
19 信号的做用是什么?
保存前写日志
20 Django的Model的继承有几种形式,分别是什么
1.一般,你只是想用父 model 来保存那些你不想在子 model 中重复录入的信息。父类是不使用的也就是不生成单独的数据表,这种状况下使用抽象基类继承
Abstract base classes。
2.若是你想从现有的Model继承并让每一个Model都有本身的数据表,那么使用多重表继承
Multi-table inheritance。
3.最后,若是你只想在 model 中修改 Python-level 级的行为,而不涉及字段改变。 代理 model (Proxy models) 适用于这种场合
21 Django中查询queryset时什么状况下用Q
#F:对数据自己的不一样字段进行操做 如:
比较和更新,对数据进行加减操做
#Q:用于构造复杂的查询条件 如:& |操做
22 Django中想验证表单提交是否格式正确须要用到Form中的哪一个函数
form.is_valid() :返回布尔值
23 orm如何取消级联
Django取消级联删除
这个文档写的比较清楚:
而且SET_NULL只有在null为True的时候,才可使用。
24 Django中如何读取和保存session,整个session的运行机制是什么
更新
在django—session表中建立一条记录:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t 更新数据
else:
1 生成随机字符串 ltv8zy1kh5lxj1if1fcs2pqwodumr45t
2 response.set_cookie("sessionid",ltv8zy1kh5lxj1if1fcs2pqwodumr45t)
3 在django—session表中建立一条记录:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t {"is_login":True,"username":"yuan"}
25 简述Django对http请求的执行流程
在接受一个Http请求以前的准备,启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,好比Django自带的开发者服务器或者uWSGI服务器。
服务器根据WSGI协议指定相应的Handler来处理Http请求,而且初始化该Handler,在Django框架中由框架自身负责实现这一个Handler。 此时服务器已处于监听状态,能够接受外界的Http请求 当一个http请求到达服务器的时候
服务器根据WSGI协议从Http请求中提取出必要的参数组成一个字典(environ)并传入Handler中进行处理。
在Handler中对已经符合WSGI协议标准规定的http请求进行分析,好比加载Django提供的中间件,路由分配,调用路由匹配的视图等。 返回一个能够被浏览器解析的符合Http协议的HttpResponse。
25 Django中当用户登陆到A服务器进入登录状态,下次被nginx代理到B服务器会出现什么影响
若是用户在A应用服务器登录的session数据没有共享到B应用服务器,那么以前的登陆状态就没有了。
26 跨域请求Django是如何处理的
- 启用中间件
- post请求
- 验证码
- 表单中添加{%csrf_token%}标签
27 查询集的两大特性?什么是惰性执行
- 惰性执行、缓存 。
- 建立查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的状况包括迭代、序列化、与if合用
28 查询集返回的列表过滤器有哪些
- all():返回全部数据
- filter():返回知足条件的数据
- exclude():返回知足条件以外的数据,至关于sql语句中where部分的not关键字
- order_by():排序
29 如何获取django urlpatterns里面注册的全部url?
from django.conf.urls import url,include
from arya.service.sites import site
from django.urls.resolvers import RegexURLPattern
from django.urls.resolvers import RegexURLResolver
from django.shortcuts import HttpResponse
def index(request):
print(get_all_url(urlpatterns,prev='/'))
return HttpResponse('...')
def get_all_url(urlparrentens,prev,is_first=False,result=[]):
if is_first:
result.clear()
for item in urlparrentens:
v = item._regex.strip('^
') #去掉url中的^和') #去掉url中的^和
if isinstance(item,RegexURLPattern):
result.append(prev + v)
else:
get_all_url(item.urlconf_name,prev + v)
return result
urlpatterns = [
url(r'^arya/', site.urls),
url(r'^index/', index),
]
30 django路由系统中include是干吗用的?
include路由转发
一般,咱们会在每一个app里,各自建立一个urls.py路由模块,而后从根路由出发,将app所属的url请求,所有转发到相应的urls.py模块中。
31 django2.0中的path与django1.xx里面的url有什么区别?
- 2.0内的path匹配正则时候无效,导入re_path便可匹配正则 url = re_path
url() 是django.urls.re_path()别名
url(regex, view, kwargs=None, name=None)[source]
This function is an alias to django.urls.re_path(). It's likely to be deprecated in a future release.
32 urlpatterns中的name与namespace有什么做用?你是如何使用的?
别名,给路由起一个别名
名称空间,防止多个应用之间的路由重复
33 如何根据urlpatterns中的name反向生成url,这样反向生成url的方式有几种?
使用HttpResponseRedirect redirect和reverse 状态码:302,301
34 如何给一个字段设置一个主键?
primary_key
35 如何设置一个带有枚举值的字典?
36 DateTimeField类型中的auto_now与auto_now_add有什么区别
DateTimeField.auto_now
这个参数的默认值为false,设置为true时,可以在保存该字段时,将其值设置为当前时间,而且每次修改model,都会自动更新。所以这个参数在须要存储“最后修改时间”的场景下,十分方便。须要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你没法程序中手动为字段赋值;若是使用django再带的admin管理器,那么该字段在admin中是只读的。
DateTimeField.auto_now_add
这个参数的默认值也为False,设置为True时,会在model对象第一次被建立时,将字段的值设置为建立时的时间,之后修改对象时,字段的值不会再更新。该属性一般被用在存储“建立时间”的场景下。与auto_now相似,auto_now_add也具备强制性,一旦被设置为True,就没法在程序中手动为字段赋值,在admin中字段也会成为只读的。
37 values()与values_list()有什么区别?
#values : 取字典的queryset
#values_list : 取元组的queryset
38 selected_related与prefetch_related有什么区别?
在Django中,全部的Queryset都是惰性的,意思是当建立一个查询集的时候,并无跟数据库发生任何交互。所以咱们能够对查询集进行级联的filter等操做,只有在访问Queryset的内容的时候,Django才会真正进行数据库的访问。而多频率、复杂的数据库查询每每是性能问题最大的根源。
不过咱们实际开发中,每每须要访问到外键对象的其余属性。若是按照默认的查询方式去遍历取值,那么会形成屡次的数据库查询,效率可想而知。
在查询对象集合的时候,把指定的外键对象也一并完整查询加载,避免后续的重复查询。
1,select_related适用于外键和多对一的关系查询;
2,prefetch_related适用于一对多或者多对多的查询。
39 当删除一个外键的时候,如何把与其关联的对应关系删除
#删除关联表中的数据时,当前表与其关联的field的操做
#django2.0以后,表与表之间关联的时候,必需要写on_delete参数,不然会报异常
40 class Meta中的元信息字段有哪些
经过一个内嵌类 "class Meta" 给你的 model 定义元数据, 相似下面这样:
class Foo(models.Model):
bar = models.CharField(maxlength=30)
class Meta:
# ...
Model 元数据就是 "不是一个字段的任何数据" -- 好比排序选项, admin 选项等等.
下面是全部可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 彻底是可选的.
app_label
app_label这个选项只在一种状况下使用,就是你的模型类不在默认的应用程序包下的models.py文件中,这时候你须要指定你这个模型类是那个应用程序的。好比你在其余地方写了一个模型类,而这个模型类是属于myapp的,那么你这是须要指定为:
app_label='myapp'
db_table
db_table是用于指定自定义数据库表名的。Django有一套默认的按照必定规则生成数据模型对应的数据库表名,若是你想使用自定义的表名,就经过这个属性指定,好比:
table_name='my_owner_table'
若不提供该参数, Django 会使用 app_label + '_' + module_name 做为表的名字.
若你的表的名字是一个 SQL 保留字, 或包含 Python 变量名不容许的字符--特别是连字符 --不要紧. Django 会自动在幕后替你将列名字和表名字用引号引发来.
db_tablespace
有些数据库有数据库表空间,好比Oracle。你能够经过db_tablespace来指定这个模型对应的数据库表放在哪一个数据库表空间。
get_latest_by
因为Django的管理方法中有个lastest()方法,就是获得最近一行记录。若是你的数据模型中有 DateField 或 DateTimeField 类型的字段,你能够经过这个选项来指定lastest()是按照哪一个字段进行选取的。
一个 DateField 或 DateTimeField 字段的名字. 若提供该选项, 该模块将拥有一个 get_latest() 函数以获得 "最新的" 对象(依据那个字段):
get_latest_by = "order_date"
managed
因为Django会自动根据模型类生成映射的数据库表,若是你不但愿Django这么作,能够把managed的值设置为False。
默认值为True,这个选项为True时Django能够对数据库表进行 migrate或migrations、删除等操做。在这个时间Django将管理数据库中表的生命周期
若是为False的时候,不会对数据库表进行建立、删除等操做。能够用于现有表、数据库视图等,其余操做是同样的。
order_with_respect_to
这个选项通常用于多对多的关系中,它指向一个关联对象。就是说关联对象找到这个对象后它是通过排序的。指定这个属性后你会获得一个get_XXX_order()和set_XXX_order()的方法,经过它们你能够设置或者回去排序的对象。
举例来讲, 若是一个 PizzaToppping 关联到一个 Pizza 对象, 这样作:
order_with_respect_to = 'pizza'
...就容许 toppings 依照相关的 pizza 来排序.
ordering
这个字段是告诉Django模型对象返回的记录结果集是按照哪一个字段排序的。好比下面的代码:
ordering=['order_date']
# 按订单升序排列
ordering=['-order_date']
# 按订单降序排列,-表示降序
ordering=['?order_date']
# 随机排序,?表示随机
ordering = ['-pub_date', 'author']
# 对 pub_date 降序,而后对 author 升序
须要注意的是:不论你使用了多少个字段排序, admin 只使用第一个字段
permissions
permissions主要是为了在Django Admin管理模块下使用的,若是你设置了这个属性可让指定的方法权限描述更清晰可读。
要建立一个对象所须要的额外的权限. 若是一个对象有 admin 设置, 则每一个对象的添加,删除和改变权限会人(依据该选项)自动建立.下面这个例子指定了一个附加权限: can_deliver_pizzas:
permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)
这是一个2-元素 tuple 的tuple或列表, 其中两2-元素 tuple 的格式为:(permission_code, human_readable_permission_name).
unique_together
unique_together这个选项用于:当你须要经过两个字段保持惟一性时使用。这会在 Django admin 层和数据库层同时作出限制(也就是相关的 UNIQUE 语句会被包括在 CREATE TABLE 语句中)。好比:一个Person的FirstName和LastName二者的组合必须是惟一的,那么须要这样设置:
unique_together = (("first_name", "last_name"),)
verbose_name
verbose_name的意思很简单,就是给你的模型类起一个更可读的名字:
verbose_name = "pizza"
若未提供该选项, Django 则会用一个类名字的 munged 版原本代替: CamelCase becomes camel case.
verbose_name_plural
这个选项是指定,模型的复数形式是什么,好比:
verbose_name_plural = "stories"
若未提供该选项, Django 会使用 verbose_name + "s".
41 多对多关联的表,如何插入数据?如何删除数据?如何更新数据?
42 django的M2M关系,如何手动生成第三张表?
tags = models.ManyToManyField(
to="Tag",
through='Article2Tag',
through_fields=('article', 'tag'),
)
43 在Django中,服务端给客户端响应信息有几种方式?分别是什么?
- HTTPresponse,
- jsonresponse,
- redirect
44 在视图函数中,经常使用的验证装饰器有哪些?
45 如何给一个视图函数加上缓存?
46 web框架的本质是什么?
本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
47 建立Django工程、Django app、以及运行的命令
48 django中csrf的实现机制
#第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;
#第二步:下次前端须要发起请求(好比发帖)的时候把这个token值加入到请求数据或者头信息中,一块儿传给后端;Cookies:{csrftoken:xxxxx}
#第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;
49 Django App的目录结构
50 Django 获取用户前端请求数据的几种方式
@get和@post使用
1:在views模板下编写测试函数(记得在urls.py文件中进行相应配置)
2:将刚刚封装的函数所在模板引入views.py
3:使用@get进行拦截
@params,response_success,response_failure使用
第一种
@login_required
def simple_view(request):
return HttpResponse()123
2 经过对基于函数视图或者基于类视图使用一个装饰器实现控制:
@login_required(MyView.as_view())1
3 经过覆盖mixin的类视图的dispatch方法实现控制:
51 描述下 自定义simple_tag
# 自定义filter:{{ 参数1|filter函数名:参数2 }}
# 1.能够与if标签来连用
# 2.自定义时须要写两个形参
# simple_tag:{% simple_tag函数名 参数1 参数2 %}
# 1.能够传多个参数,没有限制
# 2.不能与if标签来连用
@register.simple_tag
def multi_tag(x,y):
return x*y
52 什么是Cookie、如何获取、设置Cookie
会话跟踪技术,保留用户
Cookie是由服务器建立,然?后经过响应发送给客户端?的一个键值对。
具体一个浏览器针对一个服务器存储的key-value({ })
response.set_cookie("is_login",True)
request.COOKIES.get("is_login")
53 什么是session,与cookie的对比、设置、获取、清空session
Session是服务器端技术,利用这个技术,服务器在运行时能够 为每个用户的浏览器建立一个其独享的session对象,因为 session为用户浏览器独享,因此用户在访问服务器的web资源时 ,能够把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
request.session["is_login"] = True
is_login = request.session.get("is_login")
request.session.flush()
54 什么是CSRF,及防范方式
- 启用中间件
- post请求
- 验证码
- 表单中添加{%csrf_token%}标签
55 get请求和post请求的区别
请求方式: get与post请求
- GET提交的数据会放在URL以后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
- GET提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET与POST请求在服务端获取请求数据方式不一样。
- GET方式提交数据,会带来安全问题,好比一个登陆页面,经过GET方式提交数据时,用户名和密码将出如今URL上,若是页面能够被缓存或者其余人能够访问这台机器,就能够从历史记录得到该用户的帐号和密码.
56 图书管理系统的表结构是怎么设计的?
图书管理系统路由系统你用到了name了吗? 为何要使用呢?
图书管理系统的模板你是怎么用的? 重复的代码怎么解决?
57 WSGI / uwsgi/ uWSGI区分
WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器、python模块、框架、API或者任何软件,只是
一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通讯的规范。
server和application的规范在PEP3333中有具体描述,要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。
uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要作的就是把HTTP协议转化成语言支持的网络协议。好比把HTTP协议转化成WSGI协议,让Python能够直接使用。
与WSGI同样,是
uWSGI服务器的独占通讯协议,用于定义传输信息的类型(type of information)。每个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,听说该协议是fcgi【FCGI:fast common gateway interface 快速通用网关接口协议的10倍快。
58 如何使用django加密
Django 内置的User类提供了用户密码的存储、验证、修改等功能,默认使用pbkdf2_sha256方式来存储和管理用的密码。
django经过setting.py文件中的PASSWORD_HASHERS来设置选择要使用的算法,列表的第一个元素 (即settings.PASSWORD_HASHERS[0]) 会用于储存密码, 全部其它元素都是用于验证的哈希值,它们能够用于检查现有的密码。意思是若是你打算使用不一样的算法,你须要修改PASSWORD_HASHERS,来将你最喜欢的算法在列表中放在首位。
一个settings中的Password_hashers看起来是这样的:
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
具体的密码生成以及验证明现
from django.contrib.auth.hashers import make_password,check_password
pwd='4562154'
mpwd=make_password(pwd,None,'pbkdf2_sha256') # 建立django密码,第三个参数为加密算法
pwd_bool=check_password(pwd,mpwd) # 返回的是一个bool类型的值,验证密码正确与否
Django之密码加密
经过django自带的类库,来加密解密很方便,下面来简单介绍下;
导入包:
from django.contrib.auth.hashers import make_password, check_password
从名字就能够看出来他们的做用了。
一个是生成密码,一个是核对密码。
例如:
make_password("123456")
获得结果:
u'pbkdf2_sha25615000MAjic3nDGFoi$qbclz+peplspCbRF6uoPZZ42aJIIkMpGt6lQ+Iq8nfQ='
另外也能够经过参数来生成密码:
>>> make_password("123456", None, 'pbkdf2_sha256')
校验:
校验就是经过check_password(原始值, 生成的密文)来校验密码的。
>>> check_password("123456","pbkdf2_sha25615000MAjic3nDGFoi$qbclz+peplspCbRF6uoPZZ42aJIIkMpGt6lQ+Iq8nfQ=")
True
59 解释blank和null
blank
设置为True时,字段能够为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。若是为True,字段容许为空,默认不容许。
null
设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。因此设置IntegerField,DateTimeField型字段能够为空时,须要将blank,null均设为True。
若是为True,空值将会被存储为NULL,默认为False。
若是想设置BooleanField为空时能够选用NullBooleanField型字段。
一句话归纳
- null 是针对数据库而言,若是 null=True, 表示数据库的该字段能够为空。NULL represents non-existent data.
- blank 是针对表单的,若是 blank=True,表示你的表单填写该字段的时候能够不填。好比 admin 界面下增长 model 一条记录的时候。直观的看到就是该字段不是粗体
60 QueryDict和dict区别
在HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。
QueryDict相似字典的自定义类,用来处理单键对应多值的状况。
在 HttpRequest 对象中,属性 GET 和 POST 获得的都是 django.http.QueryDict 所建立的实例。这是一个
django 自定义的相似字典的类,用来处理同一个键带多个值的状况。
在 python 原始的字典中,当一个键出现多个值的时候会发生冲突,只保留最后一个值。而在 HTML 表单中,一般会发生一个键有多个值的状况,例如 <select multiple> (多选框)就是一个很常见状况。
request.POST 和request.GET 的QueryDict 在一个正常的请求/响应循环中是不可变的。若要得到可变的版本,须要使用.copy()方法。
django QuerySet对象转换成字典对象
>manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.forms.models import model_to_dict
>>> u = User.objects.get(id=1)
>>> u_dict = model_to_dict(u)
>>> type(u)
<class 'django.contrib.auth.models.User'>
>>> type(u_dict)
<type 'dict'>
1.QueryDict.__init__(query_string=None, mutable=False, encoding=None)
这是一个构造函数,其中 query_string 须要一个字符串,例如:
>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
61 谈谈你对restful规范的认识?
#首先restful是一种软件架构风格或者说是一种设计风格,并非标准,它只是提供了一组设计#原则和约束条件,主要用于客户端和服务器交互类的软件。
#就像设计模式同样,并非必定要遵循这些原则,而是基于这个风格设计的软件能够更简洁,更#有层次,咱们能够根据开发的实际状况,作相应的改变。
#它里面提到了一些规范,例如:
#1.restful 提倡面向资源编程,在url接口中尽可能要使用名词,不要使用动词
#二、在url接口中推荐使用Https协议,让网络接口更加安全
#https://www.bootcss.com/v1/mycss?page=3
#(Https是Http的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,
#所以加密的详细内容就须要SSL(安全套接层协议))
#三、在url中能够体现版本号
#https://v1.bootcss.com/mycss
#不一样的版本能够有不一样的接口,使其更加简洁,清晰
#四、url中能够体现是不是API接口
#https://www.bootcss.com/api/mycss
#五、url中能够添加条件去筛选匹配
#https://www.bootcss.com/v1/mycss?page=3
#六、能够根据Http不一样的method,进行不一样的资源操做
#(5种方法:GET / POST / PUT / DELETE / PATCH)
#七、响应式应该设置状态码
#八、有返回值,并且格式为统一的json格式
#九、返回错误信息
#返回值携带错误信息
#十、返回结果中要提供帮助连接,即API最好作到Hypermedia
#若是遇到须要跳转的状况 携带调转接口的URL
ret = {
code: 1000,
data:{
id:1,
name:'小强',
depart_id:http://www.luffycity.com/api/v1/depart/8/
}
}
62 Django 自己提供了 runserver,为何不能用来部署?
runserver 方法是调试 Django 时常常用到的运行方式,它使用 Django 自带的 WSGI Server 运行,主要在测试和开发中使用,而且 runserver 开启的方式也是单进程 。
uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通讯协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。
uWSGI 具备超快的性能、低内存占用和多 app 管理等优势,而且搭配着 Nginx 就是一个生产环境了,可以将用户访问请求与应用 app 隔离开,实现真正的部署 。相比来说,支持的并发量更高,方便管理多进程,发挥多核的优点,提高性能。
63 Tornado 的核是什么?
Tornado 的核心是 ioloop 和 iostream 这两个模块,前者提供了一个高效的 I/O 事件循环,后者则封装了 一个无阻塞的 socket 。经过向 ioloop 中添加网络 I/O 事件,利用无阻塞的 socket ,再搭配相应的回调 函数,即可达到求之不得的高效异步执行。
64 Django重定向你是如何实现的?用的什么状态码?
- 使用HttpResponseRedirect
- redirect
- 和reverse
- 状态码:302,301
65 Django中如何加载初始化数据
Django在建立对象时在掉用save()方法后,ORM框架会把对象的属性转换为写入到数据库中,实现对数据库的初始化;经过操做对象,查询数据库,将查询集返回给视图函数,经过模板语言展示在前端页面
66 简述Django下的(内建)缓存机制
Django根据设置的缓存方式,浏览器第一次请求时,cache会缓存单个变量或整个网页等内容到硬盘或者内存中,同时设置response头部,当浏览器再次发起请求时,附带f-Modified-Since请求时间到Django,Django 发现f-Modified-Since会先去参数以后,会与缓存中的过时时间相比较,若是缓存时间比较新,则会从新请求数据,并缓存起来而后返回response给客户端,若是缓存没有过时,则直接从缓存中提取数据,返回给response给客户端。