CSS Ribbon

Reproducing the GitHub Ribbon in CSS

路飞学城Python-Day136

列举Http请求中常见的请求方式
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
 
 
序号
方法
描述
1
GET
请求指定的页面信息,并返回实体主体。
2
HEAD
类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3
POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4
PUT
从客户端向服务器传送的数据取代指定的文档的内容。
5
DELETE
请求服务器删除指定的页面。
6
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7
OPTIONS
允许客户端查看服务器的性能。
8
TRACE
回显服务器收到的请求,主要用于测试或诊断。
 
谈谈你对HTTP协议的认识。什么是长连接
http协议是基于网络应用层的,对服务器和客户端(浏览器)之间的一种传输超文本的传送协议
长连接:HTTP的相应头内有Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接
HTTP协议特点
    基于TCP/IP
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通 信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间 的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。协议中存在各式各样的内容。从电缆的规格到IP地址的选定方法、 寻找异地用户的方法、双方建立通信的顺序,以及Web页面显示需要 处理的步骤,等等。像这样把与互联网相关联的协议集合起来总称为TCP/IP。而http协议是基于TCP/IP协议之上的应用层协议。
基于请求-响应模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应
无状态保存
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。
使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。可是,随着Web的不断发展,因无状态而导致业务处理变得棘手 的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管 理状态了
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
 
简述MVC模式和MVT模式
MVC模式
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示
MVT模式
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
  1. M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  2. T 代表模板 (Template):负责如何把页面展示给用户(html)。
  3. V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
    除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示
  • 简述Django请求生命周期
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
#1.wsgi,请求封装后交给web框架 (Flask、Django)     
#2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session - 
#3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数    
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 - 
#5.中间件,对响应的数据进行处理。 
#6.wsgi,将响应的内容发送给浏览器。
 
FBV(function base views) 就是在视图里使用函数处理请求
CBV(class base views) 就是在视图里使用类处理请求
    Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:
  1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
  • 谈一谈你对ORM的理解
ORM是“对象-关系-映射”的简称,ORM是一种模板语法,用于和数据库进行交互。
MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。
  • rest_framework 认证组件的流程
  • 什么是中间件并简述其作用
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
  • django中怎么写原生SQL
orm操作数据库
class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
state=models.BooleanField()
pub_date=models.DateField()
price=models.DecimalField(max_digits=8,decimal_places=2)
publish=models.CharField(max_length=32)
book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<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(): 从返回结果中剔除重复纪录
model_obj.delete()
Book.objects.filter(title__startswith="py").update(price=120)
  • F和Q的作用
F()函数的查询是orm中将字段之间进行比较,一般来说orm只是将常量做比较,这里的f()函数就是将orm语句对数据库中表的字段与字段之间作比较
Q()函数用于更复杂的查询方式,一般Q()用于或的查询或者带符号的查询(如|、&)
  • values和value_list区别
values返回的是一个字典
values_list返回的是一个元祖
  • 如何使用django orm批量创建数据
批量创建数据使用for循环,创建数据的时候尽量最后执行创建语句,使用django的语法 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)
 
  • Django中的请求生命周期
  • http访问流程
  • 命令migrate 和makemigrations的差别
makemigrations命令是在app的内部生成一系列文件,为后续的数据库文件生成做准备(有相应的sql语句但是未执行)
migrate则是对数据库进行表操作(sql语句会执行)
  • 视图函数中,接收的请求对象常用方法和属性有哪些
1.request.method == 'GET'
2.request.method == 'POST'
  • 常用视图响应的方式是什么?
1.Httpreponse
2.render
3.redirect
  • HTTP响应常见状态码分类
 
 
分类
分类描述
1**
信息,服务器收到请求,需要请求者继续执行操作
2**
成功,操作被成功接收并处理
3**
重定向,需要进一步的操作以完成请求
4**
客户端错误,请求包含语法错误或无法完成请求
5**
服务器错误,服务器在处理请求的过程中发生了错误
 
常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
      500 - 内部服务器错误
 
  • 路由匹配原则是什么?
路由选择的最长匹配原则 最长匹配原则是我司支持IP路由的设备默认的路由查找方式(事实上几乎所有支持IP路由的设备都是这种查找方式)。 当路由器收到一个IP数据包时,会将数据包的目的IP地址与自己本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目,这叫最长匹配原则
  • 缓存系统类型有哪些
要使用缓存系统需要先在settings.py中设置,Django提供多种缓存类型:Memcached缓存,数据库缓存,文件系统缓存,局部内存缓存和自定义缓存等
  • 解决跨域的常用方式是什么?
跨域是指一个域下的文档或脚本试图去请求另一个资源下的资源
跨域分三种方式的跨域连接
1.资源跳转:A标签连接、重定向、表单提交
2.资源嵌入:link srcipt img 等dom标签,其他的样式连接方式:background: url,@xxxx等引入的方式
3.脚本请求:js发起的ajax请求、dom和js对象的跨域操作等
 
  • 信号的作用是什么?
Django的Siganl是一个“信号发生器”,它是设计模式中经常提到的观察者模式的一个实现应用
在此模式中,一个目标物件管理所有依赖于它的观察者物件,并且在它本身的状态改变时,主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。
 
优点
解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。
 
它在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
 
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。这种耦合性使得代码的可读性、维护性大大提高。
 
观察者模式实现了动态联动;
 
由于观察者模式对观察者注册实行管理,那就可以在运行期间,通过动态的控制注册的观察者来控制某个动作的联动范围,从而实现动态联动。
 
观察者模式支持广播通信。
 
目标发送通知给观察者是面向所有注册的观察者,所以目标每次通知的信息就要对所有注册的观察者进行广播,也可以在目标上添加新的方法来限制广播的范围。
---------------------
作者:SuPhoebe
来源:CSDN
原文:https://blog.csdn.net/u013007900/article/details/78110891
版权声明:本文为博主原创文章,转载请附上博文链接!

  • Django的Model的继承有几种形式,分别是什么
Django 中有三种继承关系:
1. 通常你只是需要一个父类来保存子类所共有的字段而避免重复的在多个子类中定义,这个父类永远不打算单独使用,这种情况你可以选择 Abstract base classes。
2. 如果你要继承一个已经存在的 model,并且每个 model 都有其独立的数据表,你可以选择 Multi-table inheritance。
3. 如果你只想改变一个 model Python-level 的行为而不修改其字段,你可以选择 Proxy Model。
  • Django中查询queryset时什么情况下用Q
Django的Q 查询方式是用于复杂类型的查询方式,比如要用到"或"和“和”查询方式的时候就会使用
from django.db.models import Q
Q(title__startswith='Py')
Q 对象可以使用& 和| 操作符组合起来。当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。
bookList=Book.objects.filter(Q(authors__name="yuan")|Q(authors__name="egon"))
等同于下面的SQL WHERE 子句:
WHERE name ="yuan" OR name ="egon"
你可以组合& 和|  操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:
bookList=Book.objects.filter(Q(authors__name="yuan") & ~Q(publishDate__year=2017)).values_list("title")
查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。例如:
bookList=Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017),
                              title__icontains="python"
                             )
  • Django中想验证表单提交是否格式正确需要用到Form中的哪个函数
不管表单提交的是什么数据,一旦通过调用is_valid() 成功验证(is_valid() 返回True),验证后的表单数据将位于form.cleaned_data 字典中。这些数据已经为你转换好为Python 的类型。
注:此时,你依然可以从request.POST 中直接访问到未验证的数据,但是访问验证后的数据更好一些。
  • orm如何取消级联
级联就是我们说的连表的操作,连表将会使表之间通过各种关系连接起来,但是orm删除的时候是指定字段的,所以需要在model的表中通过外键连接设置级联关系删除
user = models.FroeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
需要注意的是on_delete=models.SET_NULL的前提必须是null=true
该属性还有其他值可选:
 
CASCADE: 默认的,级联删除
 
PROTECT: 通过抛出django.db.models.ProtectedErrordjango.db.models.ProtectedError错误来阻止删除关联的对象
 
SET_NULL: 设置ForeignKey 为 null; 这个只有设置了null 为 True的情况才能用
 
SET_DEFAULT: 设置 ForeignKey 为默认值; 默认值必须预先设置
 
SET(): 设置为某个方法返回的值
 
DO_NOTHING: 什么都不做,如果数据库设置必须关联则会报IntegrityError错。
---------------------
作者:happy_walker
来源:CSDN
原文:https://blog.csdn.net/happyteafriends/article/details/8687987
版权声明:本文为博主原创文章,转载请附上博文链接!
 

  • Django中如何读取和保存session,整个session的运行机制是什么
cookies和session都属于一种会话跟踪技术
Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
1.在中间件中配置session启用(默认启用)
 
1、设置Sessions值
          request.session['session_name'] ="admin"
2、获取Sessions值
          session_name = request.session["session_name"]
3、删除Sessions值
          del request.session["session_name"]
4、flush()
     删除当前的会话数据并删除会话的Cookie。
     这用于确保前面的会话数据不可以再次被用户的浏览器访问
5、get(key, default=None)
fav_color = request.session.get('fav_color', 'red')
6、pop(key)
fav_color = request.session.pop('fav_color')
7、keys()
8、items()
9、setdefault()
10 用户session的随机字符串
        request.session.session_key
   
        # 将所有Session失效日期小于当前日期的数据删除
        request.session.clear_expired()
   
        # 检查 用户session的随机字符串 在数据库中是否
        request.session.exists("session_key")
   
        # 删除当前用户的所有Session数据
        request.session.delete("session_key")
   
        request.session.set_expiry(value)
            * 如果value是个整数,session会在些秒数后失效。
            * 如果value是个datatime或timedelta,session就会在这个时间后失效。
            * 如果value是0,用户关闭浏览器session就会失效。
            * 如果value是None,session会依赖全局session失效策略。
2.设置中间件的存储方式
jango默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
   
a. 配置 settings.py
   
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
       
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
 

  • 简述Django对http请求的执行流程
一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给 Request 中间件处理,如果该中间件返回了Response,则直接传递给 Response 中间件做收尾处理。否则的话 Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给 View 中间件处理器进行处理,如果该中间件返回了Response,那么该Response 直接被传递给 Response 中间件进行后续处理,否则将执行确定的 View 函数处理并返回 Response,在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理

  • Django中当用户登录到A服务器进入登陆状态,下次被nginx代理到B服务器会出现什么影响
会重新登录(如果A服务器的session数据不和B服务器的数据共享的话)

  • 跨域请求Django是如何处理的
Django通过中间件定义middlewarecsrftoken的方式,启用中间件验证,通过post请求向表单中添加{ % csrf_token % }的方式获取csrf_token参数验证

  • 查询集的两大特性?什么是惰性执行
django的查询集就是orm操作里我们所说的QuerySet,这种查询的方式不是直接操作数据库,而是先创建一个QuerySet对象,根据后续的操作再去访问数据库
查询集的两个特性
1.惰性执行
创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集qs
qs = BookInfo.objects.all()
继续执行遍历迭代操作后,才真正的进行了数据库的查询
for book in qs:
    print(book.btitle)
2.缓存
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数
新建一个查询集对象就可以实现

  • 查询集返回的列表过滤器有哪些
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据。
order_by():对结果进行排序。

  • 如何获取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),
]
  • django路由系统中include是干嘛用的?
include是路由转发功能,因为不同的app针对的是不同的分发路由路径,所以通过from django.conf.urls import include,来确定导入的路由的路径

 
  • django2.0中的path与django1.xx里面的url有什么区别?
django2.0中写路由的正则方式需要导入re_path的方式来匹配正则表达式,直接使用会报错,django1.xx中则没有限制

 
  • urlpatterns中的name与namespace有什么作用?你是如何使用的?
name是给url中取一个别名
namespace是给url中的不同app之间可能相同的url单独分出名称空间来

 
  • 如何根据urlpatterns中的name反向生成url,这样反向生成url的方式有几种?
使用HttpResponseRedirect redirect和reverse 状态码:302,301

 
  • 如何给一个字段设置一个主键?
在models里面做primary_key的设置
  • blank=True与null=True有什么区别?
null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空。
blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填,比如 admin 界面下增加 model 一条记录的时候。直观的看到就是该字段不是粗体

 
  • 如何设置一个带有枚举值的字典?
from django.db import models
 
class Person(models.Model):
    GENDER_CHOICES = (
        (u'M', u'Male'),
        (u'F', u'Female'),
    )
    name = models.CharField(max_length=60)
    gender = models.CharField(max_length=2, choices=GENDER_CHOICES)
---------------------
作者:J了个X
来源:CSDN
原文:https://blog.csdn.net/gu_jin_xiao/article/details/26142829
版权声明:本文为博主原创文章,转载请附上博文链接!
  • 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中字段也会成为只读的。
  • values()与values_list()有什么区别?
values()取到的是一个字典中的queryset
values_list()取到的是一个元祖中的queryset

  • selected_related与prefetch_related有什么区别?
在查询对象集合的时候,把指定的外键对象也一并完整查询加载,避免后续的重复查询。
1,select_related适用于外键和多对一的关系查询;
2,prefetch_related适用于一对多或者多对多的查询。
  • 当删除一个外键的时候,如何把与其关联的对应关系删除
django中需要设置on_delete来设置级联关系表

  • 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".

  • 多对多关联的表,如何插入数据?如何删除数据?如何更新数据?
    # 当前生成的书籍对象
    book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1)
    # 为书籍绑定的做作者对象
    yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录
    egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录
 
    # 绑定多对多关系,即向关系表book_authors中添加纪录
    book_obj.authors.add(yuan,egon)    #  将某些特定的 model 对象添加到被关联对象集合中。   =======    book_obj.authors.add(*[])
+------------------------------------------------------------------------------------------------------------------------+
    book_obj.authors.remove()      # 将某个特定的对象从被关联对象集合中去除。    ======   book_obj.authors.remove(*[])
    book_obj.authors.clear()       #清空被关联对象集合
    book_obj.authors.set()         #先清空再设置  

  • django的M2M关系,如何手动生成第三张表?
tags = models.ManyToManyField(
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )
  • 如何使用原生mysql?
命令行内输入mysql -uusername -ppassword连接
mysql的命令操作具体参考第四模块的内容

  • 在Django中,服务端给客户端响应信息有几种方式?分别是什么?
* HTTPresponse,
* jsonresponse,
* redirect

  • 在视图函数中,常用的验证装饰器有哪些?
@login_required---用于验证是否有登录状态,如果没有登录,设置跳转的页面就会跳转至未登录状态的页面
@permission_required---检查用户是否具有特定权限是一项相对常见的任务
@get_permission_required---返回mixin使用的可迭代权限名称。默认为permission_required属性,必要时转换为元组。
@has_permission---返回一个布尔值,表示当前用户是否有权执行装饰视图
  • 如何给一个视图函数加上缓存?
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake'
    }
}
---------------------
作者:permike
来源:CSDN
原文:https://blog.csdn.net/permike/article/details/53217742
版权声明:本文为博主原创文章,转载请附上博文链接!

    • web框架的本质是什么?
    本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端
    • 什么是MVC、什么是MTV?
    MVC
    Web服务器开发领域里著名的MVC模式,所谓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的响应模式如下所示

    • 创建Django工程、Django app、以及运行的命令
    基于pycharm的可以实现创建django项目和app
    django-admin.py startproject mysite
    python manage.py startapp blog
    python manage.py runserver 8080
    python manange.py makemigrations
    python manange.py migrate

    • Django App的目录结构

    • 简述一下Django声明周期

    • 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方法实现控制

    • 描述下 自定义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
    • 什么是Cookie、如何获取、设置Cookie
    会话跟踪技术,保留用户
    Cookie是由服务器创建,然?后通过响应发送给客户端?的一个键值对。
    具体一个浏览器针对一个服务器存储的key-value({ })
    response.set_cookie("is_login",True)
    request.COOKIES.get("is_login")

    • 什么是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()

    • 什么是CSRF,及防范方式
    * 启用中间件
    * post请求
    * 验证码
    * 表单中添加{%csrf_token%}标签

    • django 中间件生命周期
    • get请求和post请求的区别
    *
    GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
    *
    GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
    *
    GET与POST请求在服务端获取请求数据方式不同

    • 图书管理系统的表结构是怎么设计的?
    • 图书管理系统路由系统你用到了name了吗? 为什么要使用呢?
    • 图书管理系统的模板你是怎么用的? 重复的代码怎么解决?
    • MVC和MTV分别是什么?
    MVC
    Web服务器开发领域里著名的MVC模式,所谓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的响应模式如下所示
    • WSGI / uwsgi/ uWSGI区分
    #WSGI:
    #    web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架
    #    实现wsgi协议的模块:
    #        1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
    #        2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)
    #uwsgi:
    #    与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型
    #uWSGI:
    #    是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,
     
    • 如何使用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

    • 解释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 一条记录的时候。直观的看到就是该字段不是粗体

    • 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']}>

 
 
 

posted on 2018-11-02 10:49  pandaboy1123  阅读(260)  评论(0编辑  收藏  举报

导航