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給客戶端。