1 列舉Http請求中常見的請求方式
HTTP請求的方法:
HTTP/1.1協議中共定義了八種方法(有時也叫“動作”),來表明Request-URL指定的資源不同的操作方式
注意:
1)方法名稱是區分大小寫的,當某個請求所針對的資源不支持對應的請求方法的時候,服務器應當返回狀態碼405(Mothod Not Allowed);當服務器不認識或者不支持對應的請求方法時,應返回狀態碼501(Not Implemented)。
2)
HTTP服務器至少應該實現GET和HEAD/POST方法,其他方法都是可選的,此外除上述方法,特定的HTTP服務器支持擴展自定義的方法。
GET |
向特定的路徑資源發出請求
注意:GET方法不應當被用於產生“副作用”的操作中,例如在WebApplication中,其中一個原因是GET可能會被網絡蜘蛛等隨意訪問。Loadrunner中對應get請求函數:web_link和web_url
|
POST |
向指定路徑資源提交數據進行處理請求(一般用於提交表單或者上傳文件)
數據被包含在請求體中,POST請求可能會導致新的資源的建立和/或已有資源的修改。Loadrunner中對應POST請求函數:web_submit_data,web_submit_form
|
OPTIONS |
返回服務器針對特定資源所支持的HTTP請求方法
允許客戶端查看服務器的性能,也可以利用向web服務器發送‘*’的請求來測試服務器的功能性
|
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 路由匹配原則是什么?
1、關於正則匹配優先級
在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 請求不能發送
二、從安全性而言選擇那種跨域方式最好,為什么?
一般最安全的是WINDOW.NAME,因為iframe會銷毀
三、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中的^和$
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接口中盡量要使用名詞,不要使用動詞
#2、在url接口中推薦使用Https協議,讓網絡接口更加安全
#https://www.bootcss.com/v1/mycss?page=3
#(Https是Http的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,
#因此加密的詳細內容就需要SSL(安全套接層協議))
#3、在url中可以體現版本號
#https://v1.bootcss.com/mycss
#不同的版本可以有不同的接口,使其更加簡潔,清晰
#4、url中可以體現是否是API接口
#https://www.bootcss.com/api/mycss
#5、url中可以添加條件去篩選匹配
#https://www.bootcss.com/v1/mycss?page=3
#6、可以根據Http不同的method,進行不同的資源操作
#(5種方法:GET / POST / PUT / DELETE / PATCH)
#7、響應式應該設置狀態碼
#8、有返回值,而且格式為統一的json格式
#9、返回錯誤信息
#返回值攜帶錯誤信息
#10、返回結果中要提供幫助鏈接,即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給客戶端。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">