日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django框架基础知识点

發(fā)布時(shí)間:2024/1/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django框架基础知识点 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Django框架

1.Django創(chuàng)建項(xiàng)目的命令
django-admin startproject 項(xiàng)目名稱
python manage.py startapp 應(yīng)用app名

2.Django創(chuàng)建項(xiàng)目后,項(xiàng)目文件夾下的組成部分
此題考的是學(xué)員對(duì)MVT 的理解
項(xiàng)目文件夾下的組成部分:
manage.py 是項(xiàng)目運(yùn)行的入口,指定配置文件路徑。與項(xiàng)目同名的目錄,包含項(xiàng)目的配置文件。
init.py 是一個(gè)空文件,作用是這個(gè)目錄可以被當(dāng)作包使用。
settings.py 是項(xiàng)目的整體配置文件。
urls.py 是項(xiàng)目的URL配置文件。
wsgi.py 是項(xiàng)目與 WSGI 兼容的 Web 服務(wù)器。
manage.py 是項(xiàng)目運(yùn)行的入口,指定配置文件路徑。與項(xiàng)目同名的目錄,包含項(xiàng)目的配置文件。
init.py是一個(gè)空文件,作用是這個(gè)目錄可以被當(dāng)做包使用

3.對(duì) MVC,MVT 解讀的理解
MVC:
M:Model,模型,和數(shù)據(jù)庫(kù)進(jìn)行交互
V:View,視圖,負(fù)責(zé)產(chǎn)生 Html 頁面
C:Controller,控制器,接收請(qǐng)求,進(jìn)行處理,與 M 和 V 進(jìn)行交互,返回應(yīng)答。

(1) 用戶點(diǎn)擊注按鈕,將要注冊(cè)的信息發(fā)送給網(wǎng)站服務(wù)器。
(2)Controller 控制器接收到用戶的注冊(cè)信息,Controller 會(huì)告訴 Model 層將用戶的注冊(cè)信息保存到數(shù)據(jù)庫(kù)
(3)Model 層將用戶的注冊(cè)信息保存到數(shù)據(jù)庫(kù)
(4) 數(shù)據(jù)保存之后將保存的結(jié)果返回給 Model 模型,
(5)Model 層將保存的結(jié)果返回給 Controller 控制器。
(6)Controller 控制器收到保存的結(jié)果之后,或告訴 View 視圖,view 視圖產(chǎn)生一個(gè) html 頁面。
(7)View 將產(chǎn)生的 Html 頁面的內(nèi)容給了 Controller 控制器。
(8)Controller將Html頁面的內(nèi)容返回給瀏覽器。
(9)瀏覽器接受到服務(wù)器 Controller 返回的 Html 頁面進(jìn)行解析展示。

MVT:
M:Model,模型,和 MVC 中的 M 功能相同,和數(shù)據(jù)庫(kù)進(jìn)行交互。
V:view,視圖,和 MVC 中的 C 功能相同,接收請(qǐng)求,進(jìn)行處理,與 M 和 T 進(jìn)行交互,返回應(yīng)答。
T:Template,模板,和 MVC 中的 V 功能相同,產(chǎn)生 Html 頁面.

(1)用戶點(diǎn)擊注冊(cè)按鈕,將要注冊(cè)的內(nèi)容發(fā)送給網(wǎng)站的服務(wù)器。
(2) View 視圖,接收到用戶發(fā)來的注冊(cè)數(shù)據(jù),View 告訴 Model 將用戶的注冊(cè)信息保存進(jìn)數(shù)據(jù)庫(kù)。
(3)Model 層將用戶的注冊(cè)信息保存到數(shù)據(jù)庫(kù)中。
(4)數(shù)據(jù)庫(kù)將保存的結(jié)果返回給 Model
(5)Model 將保存的結(jié)果給 View 視圖。
(6)View 視圖告訴 Template 模板去產(chǎn)生一個(gè) Html 頁面。
(7)Template 生成 html 內(nèi)容返回給 View 視圖。
(8)View 將 html 頁面內(nèi)容返回給瀏覽器。
(9) 瀏覽器拿到 view 返回的 html 頁面內(nèi)容進(jìn)行解析,展示。

4.Django中models利用ORM對(duì)Mysql 進(jìn)行查表的語句(多個(gè)語句)
字段查詢
all():返回模型類對(duì)應(yīng)表格中的所有數(shù)據(jù)。
get():
返回表格中滿足條件的一條數(shù)據(jù),如果查到多條數(shù)據(jù),則拋異常:MultipleObjectsReturned, 查詢不到數(shù)據(jù),則拋異常:DoesNotExist。

filter():
參數(shù)寫查詢條件,返回滿足條件 QuerySet 集合數(shù)據(jù)。
條件格式:
模型類屬性名:條件名=值
注意:此處是模型類屬性名,不是表中的字段名
關(guān)于 filter 具體案例如下:
判等exact
BookInfo.object.filter(id=1)
BookInfo.object.filter(id exact=1)此處的 exact 可以省略
模糊查詢 like
例:查詢書名包含’傳’的圖書。contains
contains BookInfo.objects.filter(btitle contains=’傳’)
空查詢 where 字段名 isnull
BookInfo.objects.filter(btitle isnull=False)
范圍查詢 where id in (1,3,5)
BookInfo.objects.filter(id in=[1,3,5])
比較查詢 gt lt(less than) gte(equal) lte
BookInfo.objects.filter(id gte=3)
日期查詢
BookInfo.objects.filter(bpub_date year = 1980)
BookInfo.objects.filter(bpub_date gt = date(1980,1,1))
exclude:返回不滿足條件的數(shù)據(jù)。
BookInfo.objects.exclude(id=3)
F 對(duì) 象
作用:用于類屬性之間的比較條件。
from django.db.models import F
例:where bread > bcomment BookInfo.objects.filter(bread gt =F(‘bcomment’))
例:BookInfo.objects.filter(bread gt=F(‘bcomment’)*2)
Q 對(duì) 象
作用:用于查詢時(shí)的邏輯條件。可以對(duì) Q 對(duì)象進(jìn)行&|~操作
from django.db.models import Q
BookInfo.objects.filter(id gt=3, bread gt=30)
BooInfo.objects.filter(Q(id gt=3) & Q(bread gt=3))
例 :BookInfo.objects.filter(Q(id gt=3) | Q(bread gt=30))
例:BookInfo.objects.filter(~Q(id=3))
order_by 返 回 QuerySet
作用:對(duì)查詢結(jié)果進(jìn)行排序。
例 : BookInfo.objects.all().order_by(‘id’)
例 : BookInfo.objects.all().order_by(’-id’)
例 :BookInfo.objects.filter(id gt=3).order_by(’-bread’)
聚合函數(shù)
作用:對(duì)查詢結(jié)果進(jìn)行聚合操作。
sum count max min avg
aggregate:調(diào)用這個(gè)函數(shù)來使用聚合。
from django.db.models import Sum,Count,Max,Min,Avg
例:BookInfo.objects.aggregate(Count(‘id’))
{‘id count’: 5} 注意返回值類型及鍵名
例:BookInfo.objects.aggregate(Sum(‘bread’))
{‘bread sum’:120} 注意返回值類型及鍵名
count 函 數(shù)
作用:統(tǒng)計(jì)滿足條件數(shù)據(jù)的數(shù)目。例:統(tǒng)計(jì)所有圖書的數(shù)目。
BookInfo.objects.all().count()
例:統(tǒng)計(jì) id 大于 3 的所有圖書的數(shù)目。
BookInfo.objects.filter(id gt = 3).count()
模型類關(guān)系
1)一對(duì)多關(guān)系
例:圖書類-英雄類
models.ForeignKey() 定義在多的類中。
2)多對(duì)多關(guān)系
例:新聞?lì)?新聞?lì)愋皖?br /> models.ManyToManyField() 定義在哪個(gè)類中都可以。
3)一對(duì)一關(guān)系
例:員工基本信息類-員工詳細(xì)信息類
models.OneToOneField() 定義在哪個(gè)類中都可以。

5.django 中間件的使用
Django 在中間件中預(yù)置了六個(gè)方法,這六個(gè)方法的區(qū)別在于不同的階段執(zhí)行,對(duì)輸入或輸出進(jìn)行干預(yù),方法如下:
(1)初始化:無需任何參數(shù),服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用一次,用于確定是否啟用當(dāng)前中間件。
def init ():
pass
(2)處理請(qǐng)求前:在每個(gè)請(qǐng)求上調(diào)用,返回 None 或 HttpResponse 對(duì)象。
def process_request(request):
pass
(3)處理視圖前:在每個(gè)請(qǐng)求上調(diào)用,返回 None 或 HttpResponse 對(duì)象。
def process_view(request, view_func, view_args, view_kwargs):
pass
(4)處理模板響應(yīng)前:在每個(gè)請(qǐng)求上調(diào)用,返回實(shí)現(xiàn)了 render 方法的響應(yīng)對(duì)象。
def process_template_response(request, response):
pass
(5)處理響應(yīng)后:所有響應(yīng)返回瀏覽器之前被調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回 HttpResponse 對(duì)象。
def process_response(request, response):
pass
(6)異常處理:當(dāng)視圖拋出異常時(shí)調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回一個(gè) HttpResponse 對(duì)象。
def process_exception(request,exception):
pass

6.談一下你對(duì) uWSGI 和 nginx 的理解?
(1 )uWSGI 是一個(gè) Web 服務(wù)器,它實(shí)現(xiàn)了 WSGI 協(xié)議、uwsgi、http 等協(xié)議。Nginx 中HttpUwsgiModule 的作用是與 uWSGI 服務(wù)器進(jìn)行交換。WSGI 是一種 Web 服務(wù)器網(wǎng)關(guān)接口。它是一個(gè) Web 服務(wù)器(如 nginx,uWSGI 等服務(wù)器)與 web 應(yīng)用(如用 Flask 框架寫的程序)通信的一種規(guī)范。
要注意 WSGI / uwsgi / uWSGI 這三個(gè)概念的區(qū)分。
WSGI 是一種通信協(xié)議。
uwsgi 是一種線路協(xié)議而不是通信協(xié)議,在此常用于在 uWSGI 服務(wù)器與其他網(wǎng)絡(luò)服務(wù)器的數(shù)據(jù)通信。
uWSGI 是實(shí)現(xiàn)了 uwsgi 和 WSGI 兩種協(xié)議的 Web 服務(wù)器。
(2)nginx 是一個(gè)開源的高性能的 HTTP 服務(wù)器和反向代理:
1.作為 web 服務(wù)器,它處理靜態(tài)文件和索引文件效果非常高;
2.它的設(shè)計(jì)非常注重效率,最大支持 5 萬個(gè)并發(fā)連接,但只占用很少的內(nèi)存空間;
3.穩(wěn)定性高,配置簡(jiǎn)潔;
4.強(qiáng)大的反向代理和負(fù)載均衡功能,平衡集群中各個(gè)服務(wù)器的負(fù)載壓力應(yīng)用。

7.nginx 和 uWISG 服務(wù)器之間如何配合工作的
首先瀏覽器發(fā)起 http 請(qǐng)求到 nginx 服務(wù),Nginx 根據(jù)接收到請(qǐng)求包,進(jìn)行 url 分析,判斷訪問的資源類型,如果是靜態(tài)資源,直接讀取靜態(tài)資源返回給瀏覽器,如果請(qǐng)求的是動(dòng)態(tài)資源就轉(zhuǎn)交給 uwsgi 服務(wù),uwsgi 服務(wù)根據(jù)自身的 uwsgi 和 WSGI 協(xié)議,找到對(duì)應(yīng)的 Django 框架,Django 框架下的應(yīng)用進(jìn)行邏輯處理后,將返回值發(fā)送到 uwsgi 服務(wù),然后 uwsgi 服務(wù)再返回給 nginx,最后 nginx 將返回值返回給瀏覽器進(jìn)行渲染顯示給用戶。
(如果可以,畫圖講解效果更佳,可以 將下面的圖畫給面試官。)

8.django 開發(fā)中數(shù)據(jù)庫(kù)做過什么優(yōu)化
(1)設(shè)計(jì)表時(shí),盡量少使用外鍵,因?yàn)橥怄I約束會(huì)影響插入和刪除性能;
(2)使用緩存,減少對(duì)數(shù)據(jù)庫(kù)的訪問;
(3)在 orm 框架下設(shè)置表時(shí),能用 varchar 確定字段長(zhǎng)度時(shí),就別用 text;
(4)可以給搜索頻率高的字段屬性,在定義時(shí)創(chuàng)建索引;
(5)Django orm 框架下的 Querysets 本來就有緩存的;
(6)如果一個(gè)頁面需要多次連接數(shù)據(jù)庫(kù),最好一次性取出所有需要的數(shù)據(jù),減少對(duì)數(shù)據(jù)庫(kù)的查詢次數(shù);
(7)若頁面只需要數(shù)據(jù)庫(kù)里某一個(gè)兩個(gè)字段時(shí),可以用 QuerySet.values();
(8)在模板標(biāo)簽里使用 with 標(biāo)簽可以緩存 Qset 的查詢結(jié)果。

9.驗(yàn)證碼過期時(shí)間怎么設(shè)置
將驗(yàn)證碼保存到數(shù)據(jù)庫(kù)或 session,設(shè)置過期時(shí)間為 1 分鐘,然后頁面設(shè)置一個(gè)倒計(jì)時(shí)(一般是前端js 實(shí)現(xiàn)這個(gè)計(jì)時(shí))的展示,一分鐘過后再次點(diǎn)擊獲取新的信息。

10.Python 中三大框架各自的應(yīng)用場(chǎng)景
django:
主要是用來搞快速開發(fā)的,他的亮點(diǎn)就是快速開發(fā),節(jié)約成本,正常的并發(fā)量不過 10000, 如果要實(shí)現(xiàn)高并發(fā)的話,就要對(duì) django 進(jìn)行二次開發(fā),比如把整個(gè)笨重的框架給拆掉,自己寫 socket 實(shí)現(xiàn) http 的通信,底層用純 c,c++寫提升效率,ORM 框架給干掉,自己編寫封裝與數(shù)據(jù)庫(kù)交互的框架,因?yàn)樯赌?#xff0c;ORM 雖然面向?qū)ο髞聿僮鲾?shù)據(jù)庫(kù),但是它的效率很低,使用外鍵來聯(lián)系表與表之間的查詢;
flask:
輕量級(jí),主要是用來寫接口的一個(gè)框架,實(shí)現(xiàn)前后端分離,提升開發(fā)效率,Flask 本身相當(dāng)于一個(gè)內(nèi)核,其他幾乎所有的功能都要用到擴(kuò)展(郵件擴(kuò)展 Flask-Mail,用戶認(rèn)證 Flask-Login),都需要用第三方的擴(kuò)展來實(shí)現(xiàn)。比如可以用 Flask-extension 加入 ORM、窗體驗(yàn)證工具,文件上傳、身份驗(yàn)證等。Flask 沒有默認(rèn)使用的數(shù)據(jù)庫(kù),你可以選擇 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模塊),模板引擎則使用 Jinja2。這兩個(gè)也是 Flask 框架的核心。Python 最出名的框架要數(shù) Django,此外還有 Flask、Tornado 等框架。雖然 Flask 不是最出名的框架,但是 Flask 應(yīng)該算是最靈活的框架之一,這也是 Flask 受到廣大開發(fā)者喜愛的原因。
Tornado:
Tornado 是一種 Web 服務(wù)器軟件的開源版本。Tornado 和現(xiàn)在的主流 Web 服務(wù)器框架(包括大多數(shù) Python 的框架)有著明顯的區(qū)別:它是非阻塞式服務(wù)器,而且速度相當(dāng)快。
得利于其非阻塞的方式和對(duì) epoll 的運(yùn)用,Tornado 每秒可以處理數(shù)以千計(jì)的連接,因此 Tornado是實(shí)時(shí) Web 服務(wù)的一個(gè) 理想框架。

11.django 如何提升性能(高并發(fā))
對(duì)一個(gè)后端開發(fā)程序員來說,提升性能指標(biāo)主要有兩個(gè)一個(gè)是并發(fā)數(shù),另一個(gè)是響應(yīng)時(shí)間網(wǎng)站性能的優(yōu)化一般包括 web 前端性能優(yōu)化,應(yīng)用服務(wù)器性能優(yōu)化,存儲(chǔ)服務(wù)器優(yōu)化。
對(duì)前端的優(yōu)化主要有:
(1)減少 http 請(qǐng)求,減少數(shù)據(jù)庫(kù)的訪問量,比如使用雪碧圖。
(2)使用瀏覽器緩存,將一些常用的 css,js,logo 圖標(biāo),這些靜態(tài)資源緩存到本地瀏覽器,通過設(shè)置 http 頭中的 cache-control 和 expires 的屬性,可設(shè)定瀏覽器緩存,緩存時(shí)間可以自定義。
(3)對(duì) html,css,javascript 文件進(jìn)行壓縮,減少網(wǎng)絡(luò)的通信量。

對(duì)我個(gè)人而言,我做的優(yōu)化主要是以下三個(gè)方面:
(1)合理的使用緩存技術(shù),對(duì)一些常用到的動(dòng)態(tài)數(shù)據(jù),比如首頁做一個(gè)緩存,或者某些常用的數(shù)據(jù)做個(gè)緩存,設(shè)置一定得過期時(shí)間,這樣減少了對(duì)數(shù)據(jù)庫(kù)的壓力,提升網(wǎng)站性能。
(2)使用 celery 消息隊(duì)列,將耗時(shí)的操作扔到隊(duì)列里,讓 worker 去監(jiān)聽隊(duì)列里的任務(wù),實(shí)現(xiàn)異步操作,比如發(fā)郵件,發(fā)短信。
(3)就是代碼上的一些優(yōu)化,補(bǔ)充:nginx 部署項(xiàng)目也是項(xiàng)目?jī)?yōu)化,可以配置合適的配置參數(shù),提升效率,增加并發(fā)量。
(4)如果太多考慮安全因素,服務(wù)器磁盤用固態(tài)硬盤讀寫,遠(yuǎn)遠(yuǎn)大于機(jī)械硬盤,這個(gè)技術(shù)現(xiàn)在沒有普及,主要是固態(tài)硬盤技術(shù)上還不是完全成熟, 相信以后會(huì)大量普及。
(5)另外還可以搭建服務(wù)器集群,將并發(fā)訪問請(qǐng)求,分散到多臺(tái)服務(wù)器上處理。
(6)最后就是運(yùn)維工作人員的一些性能優(yōu)化技術(shù)了。

12.什么是 restful api,談?wù)勀愕睦斫?br /> REST:Representational State Transfer 的縮寫,翻譯:“具象狀態(tài)傳輸”。一般解釋為“表現(xiàn)層狀態(tài)轉(zhuǎn)換”。
REST 是設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn)。是指客戶端和服務(wù)器的交互形式。我們需要關(guān)注的重點(diǎn)是如何設(shè)計(jì)
REST 風(fēng)格的網(wǎng)絡(luò)接口。
REST 的特點(diǎn):
(1)具象的。一般指表現(xiàn)層,要表現(xiàn)的對(duì)象就是資源。比如,客戶端訪問服務(wù)器,獲取的數(shù)據(jù)就是資源。比如文字、圖片、音視頻等。
(2)表現(xiàn):資源的表現(xiàn)形式。txt 格式、html 格式、json 格式、jpg 格式等。瀏覽器通過 URL 確定資源的位置,但是需要在 HTTP 請(qǐng)求頭中,用 Accept 和 Content-Type 字段指定,這兩個(gè)字段是對(duì)資源表現(xiàn)的描述。
(3)狀態(tài)轉(zhuǎn)換:客戶端和服務(wù)器交互的過程。在這個(gè)過程中,一定會(huì)有數(shù)據(jù)和狀態(tài)的轉(zhuǎn)化,這種轉(zhuǎn)化叫做狀態(tài)轉(zhuǎn)換。其中,GET 表示獲取資源,POST 表示新建資源,PUT 表示更新資源,DELETE 表示刪除資源。HTTP 協(xié)議中最常用的就是這四種操作方式。
RESTful 架構(gòu):
(1)每個(gè) URL 代表一種資源;
(2)客戶端和服務(wù)器之間,傳遞這種資源的某種表現(xiàn)層;
(3)客戶端通過四個(gè) http 動(dòng)詞,對(duì)服務(wù)器資源進(jìn)行操作,實(shí)現(xiàn)表現(xiàn)層狀態(tài)轉(zhuǎn)換。

13.如何設(shè)計(jì)符合 RESTful 風(fēng)格的 API
一、域名:
將 api 部署在專用域名下: http://api.example.com 或者將 api 放在主域名下:
http://www.example.com/api/
二、版本:
將 API 的版本號(hào)放在 url 中。http://www.example.com/app/1.0/info http://www.example.com/app/1.2/info
三、路徑:
路徑表示 API 的具體網(wǎng)址。每個(gè)網(wǎng)址代表一種資源。 資源作為網(wǎng)址,網(wǎng)址中不能有動(dòng)詞只能有名詞,一般名詞要與數(shù)據(jù)庫(kù)的表名對(duì)應(yīng)。而且名詞要使用復(fù)數(shù)。
錯(cuò) 誤 示 例 : http://www.example.com/getGoods http://www.example.com/listOrders
正確示例:
#獲取單個(gè)商品
http://www.example.com/app/goods/1
#獲取所有商品http://www.example.com/app/goods
四、使用標(biāo)準(zhǔn)的 HTTP 方法:
對(duì)于資源的具體操作類型,由 HTTP 動(dòng)詞表示。 常用的 HTTP 動(dòng)詞有四個(gè)。
GET SELECT :從服務(wù)器獲取資源。
POST CREATE :在服務(wù)器新建資源。
PUT UPDATE :在服務(wù)器更新資源。
DELETE DELETE :從服務(wù)器刪除資源。示例:
#獲取指定商品的信息
GET http://www.example.com/goods/ID
#新建商品的信息
POST http://www.example.com/goods
#更新指定商品的信息
PUT http://www.example.com/goods/ID
#刪除指定商品的信息
DELETE http://www.example.com/goods/ID
五、過濾信息:
如果資源數(shù)據(jù)較多,服務(wù)器不能將所有數(shù)據(jù)一次全部返回給客戶端。API 應(yīng)該提供參數(shù),過濾返回結(jié)果。 實(shí)例:
#指定返回?cái)?shù)據(jù)的數(shù)量
http://www.example.com/goods?limit=10
#指定返回?cái)?shù)據(jù)的開始位置http://www.example.com/goods?offset=10
#指定第幾頁,以及每頁數(shù)據(jù)的數(shù)量http://www.example.com/goods?page=2&per_page=20
六、狀態(tài)碼:
服務(wù)器向用戶返回的狀態(tài)碼和提示信息,常用的有: 200 OK :服務(wù)器成功返回用戶請(qǐng)求的數(shù)據(jù)
201 CREATED :用戶新建或修改數(shù)據(jù)成功。
202 Accepted:表示請(qǐng)求已進(jìn)入后臺(tái)排隊(duì)。
400 INVALID REQUEST :用戶發(fā)出的請(qǐng)求有錯(cuò)誤。401 Unauthorized :用戶沒有權(quán)限。
403 Forbidden :訪問被禁止。
404 NOT FOUND :請(qǐng)求針對(duì)的是不存在的記錄。406 Not Acceptable :用戶請(qǐng)求的的格式不正確。500 INTERNAL SERVER ERROR :服務(wù)器發(fā)生錯(cuò)誤。
七、錯(cuò)誤信息:
一般來說,服務(wù)器返回的錯(cuò)誤信息,以鍵值對(duì)的形式返回。
{
error: ‘Invalid API KEY’
}

八、響應(yīng)結(jié)果:
針對(duì)不同結(jié)果,服務(wù)器向客戶端返回的結(jié)果應(yīng)符合以下規(guī)范。
#返回商品列表
GET http://www.example.com/goods
#返回單個(gè)商品
GET http://www.example.com/goods/cup #返回新生成的商品
POST http://www.example.com/goods
#返回一個(gè)空文檔
DELETE http://www.example.com/goods
九、使用鏈接關(guān)聯(lián)相關(guān)的資源:
在返回響應(yīng)結(jié)果時(shí)提供鏈接其他 API 的方法,使客戶端很方便的獲取相關(guān)聯(lián)的信息。
十、其他:
服務(wù)器返回的數(shù)據(jù)格式,應(yīng)該盡量使用 JSON,避免使用 XML。

13.什么 csrf 攻擊原理?如何解決?

簡(jiǎn)單來說就是: 你訪問了信任網(wǎng)站 A,然后 A 會(huì)用保存你的個(gè)人信息并返回給你的瀏覽器一個(gè)cookie,然后呢,在 cookie 的過期時(shí)間之內(nèi),你去訪問了惡意網(wǎng)站 B,它給你返回一些惡意請(qǐng)求代碼, 要求你去訪問網(wǎng)站 A,而你的瀏覽器在收到這個(gè)惡意請(qǐng)求之后,在你不知情的情況下,會(huì)帶上保存在本地瀏覽器的 cookie 信息去訪問網(wǎng)站 A,然后網(wǎng)站 A 誤以為是用戶本身的操作,導(dǎo)致來自惡意網(wǎng)站 C 的攻擊代碼會(huì)被執(zhí):發(fā)郵件,發(fā)消息,修改你的密碼,購(gòu)物,轉(zhuǎn)賬,偷窺你的個(gè)人信息,導(dǎo)致私人信息泄漏和賬戶財(cái)產(chǎn)安全收到威脅

14.啟動(dòng) Django 服務(wù)的方法
runserver 方法是調(diào)試 Django 時(shí)經(jīng)常用到的運(yùn)行方式,它使用 Django 自帶的 WSGI Server 運(yùn)行,主要在測(cè)試和開發(fā)中使用,并且 runserver 開啟的方式也是單進(jìn)程。
python manage.py runserver ip:端口

15.怎樣測(cè)試django 框架中的代碼
在單元測(cè)試方面,Django 繼承 python 的 unittest.TestCase 實(shí)現(xiàn)了自己的
django.test.TestCase,編寫測(cè)試用例通常從這里開始。測(cè)試代碼通常位于 app 的 tests.py 文件中(也可以在 models.py 中編寫,一般不建議)。在 Django 生成的 depotapp 中,已經(jīng)包含了這個(gè)文件, 并且其中包含了一個(gè)測(cè)試
用例的樣例:
python manage.py test:執(zhí)行所有的測(cè)試用例
python manage.py test app_name, 執(zhí)行該 app 的所有測(cè)試用例
python manage.py test app_name.case_name: 執(zhí)行指定的測(cè)試用例
一些測(cè)試工具:unittest 或者 pytest

16.有過部署經(jīng)驗(yàn)?用的什么技術(shù)?可以滿足多少壓力
1有部署經(jīng)驗(yàn),在阿里云服務(wù)器上部署的
2.技術(shù)有:nginx + uwsgi 的方式來部署 Django 項(xiàng)目
3.無標(biāo)準(zhǔn)答案(例:壓力測(cè)試一兩千)

17.Django 中哪里用到了線程?哪里用到了協(xié)程?哪里用到了進(jìn)程?
Django中耗時(shí)的任務(wù)用一個(gè)進(jìn)程或者線程來執(zhí)行,比如發(fā)郵件,使用 celery。
部署 django 項(xiàng)目的時(shí)候,配置文件中設(shè)置了進(jìn)程和協(xié)程的相關(guān)配置。

18.django關(guān)閉瀏覽器,怎樣清除 cookies 和 session
設(shè) 置 Cookie:
def cookie_set():
response = HttpResponse(“

設(shè)置 Cookie,請(qǐng)查看響應(yīng)報(bào)文頭

”)
response.set_cookie(‘h1’, ‘hello django’)
讀 取 Cookie:
def cookie_get(request):
response = HttpResponse(“讀取 Cookie,數(shù)據(jù)如下:
”)
if request.COOKIES.has_key(‘h1’):
response.write(’

’ + request.COOKIES[‘h1’] + ‘

’)
以鍵值對(duì)的格式寫會(huì)話:
request.session[‘鍵’]=值
根據(jù)鍵讀取值:
request.session.get(‘鍵’,默認(rèn)值)
清除所有會(huì)話,在存儲(chǔ)中刪除值部分:
request.session.clear()
清除會(huì)話數(shù)據(jù),在存儲(chǔ)中刪除會(huì)話的整條數(shù)據(jù):
request.session.flush()
刪除會(huì)話中的指定鍵及值,在存儲(chǔ)中只刪除某個(gè)鍵及對(duì)應(yīng)的值:
del request.session[‘鍵’]
設(shè)置會(huì)話的超時(shí)時(shí)間,如果沒有指定過期時(shí)間則兩個(gè)星期后過期。
request.session.set_expiry(value)
如果 value 是一個(gè)整數(shù),會(huì)話將在 value 秒沒有活動(dòng)后過期。
如果 value 為 0,那么用戶會(huì)話的 Cookie 將在用戶的瀏覽器關(guān)閉時(shí)過期。如果 value 為 None,那么會(huì)話永不過期。
Session 依賴于 Cookie,如果瀏覽器不能保存 cookie 那么 session 就失效了。因?yàn)樗枰獮g覽器的 cookie 值去 session 里做對(duì)比。session 就是用來在服務(wù)器端保存用戶的會(huì)話狀態(tài)。
cookie 可以有過期時(shí)間,這樣瀏覽器就知道什么時(shí)候可以刪除 cookie 了。 如果 cookie 沒有設(shè)置過期時(shí)間,當(dāng)用戶關(guān)閉瀏覽器的時(shí)候,cookie 就自動(dòng)過期了。你可以改變
SESSION_EXPIRE_AT_BROWSER_CLOSE 的設(shè)置來控制 session 框架的這一行為。缺省情況下,
SESSION_EXPIRE_AT_BROWSER_CLOSE 設(shè)置為 False ,這樣,會(huì)話 cookie 可以在用戶瀏覽器中保持有效達(dá) SESSION_COOKIE_AGE 秒(缺省設(shè)置是兩周,即 1,209,600 秒)如果你不想用戶每次打開瀏覽器都必須重新登陸的話,用這個(gè)參數(shù)來幫你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 設(shè)置為 True,當(dāng)瀏覽器關(guān)閉時(shí),Django 會(huì)使 cookie 失效。
SESSION_COOKIE_AGE:設(shè)置 cookie 在瀏覽器中存活的時(shí)間。

19.代碼優(yōu)化從哪些方面考慮?有什么想法
(1)優(yōu)化算法時(shí)間
算法的時(shí)間復(fù)雜度對(duì)程序的執(zhí)行效率影響最大,在 Python 中可以通過選擇合適的數(shù)據(jù)結(jié)構(gòu)來優(yōu)化時(shí)間復(fù)雜度,如 list 和 set 查找某一個(gè)元素的時(shí)間復(fù)雜度分別是 O(n)和 O(1)。不同的場(chǎng)景有不同的優(yōu)化方式,總得來說,一般有分治,分支界限,貪心,動(dòng)態(tài)規(guī)劃等思想。
(2)循環(huán)優(yōu)化
每種編程語言都會(huì)強(qiáng)調(diào)需要優(yōu)化循環(huán)。當(dāng)使用 Python 的時(shí)候,你可以依靠大量的技巧使得循環(huán)運(yùn)行得更快。然而,開發(fā)者經(jīng)常漏掉的一個(gè)方法是:
避免在一個(gè)循環(huán)中使用點(diǎn)操作。每一次你調(diào)用方法 str.upper,Python 都會(huì)求該方法的值。然而, 如果你用一個(gè)變量代替求得的值,值就變成了已知的,Python 就可以更快地執(zhí)行任務(wù)。優(yōu)化循環(huán)的關(guān)鍵,是要減少 Python 在循環(huán)內(nèi)部執(zhí)行的工作量,因?yàn)?Python 原生的解釋器在那種情況下,真的會(huì)減緩執(zhí)行的速度。(注意:優(yōu)化循環(huán)的方法有很多,這只是其中的一個(gè)。例如,許多程序員都會(huì)說,列表推導(dǎo)是在循環(huán)中提高執(zhí)行速度的最好方式。這里的關(guān)鍵是,優(yōu)化循環(huán)是程序取得更高的執(zhí)行速度的更好方式之一。)
(3)函數(shù)選擇
在循環(huán)的時(shí)候使用 xrange 而不是 range;使用 xrange 可以節(jié)省大量的系統(tǒng)內(nèi)存,因?yàn)?xrange() 在序列中每次調(diào)用只產(chǎn)生一個(gè)整數(shù)元素。而 range()將直接返回完整的元素列表,用于循環(huán)時(shí)會(huì)有不必要的開銷。在 python3 中 xrange 不再存在,里面 range 提供一個(gè)可以遍歷任意長(zhǎng)度的范圍的iterator。
(4)并行編程
因?yàn)?GIL 的存在,Python 很難充分利用多核 CPU 的優(yōu)勢(shì)。但是,可以通過內(nèi)置的模塊multiprocessing 實(shí)現(xiàn)下面幾種并行模式:
多進(jìn)程:對(duì)于 CPU 密集型的程序,可以使用 multiprocessing 的 Process,Pool 等封裝好的類, 通過多進(jìn)程的方式實(shí)現(xiàn)并行計(jì)算。但是因?yàn)檫M(jìn)程中的通信成本比較大,對(duì)于進(jìn)程之間需要大量數(shù)據(jù)交互的程序效率未必有大的提高。
多線程:對(duì)于 IO 密集型的程序,multiprocessing.dummy 模塊使用 multiprocessing 的接口封裝 threading,使得多線程編程也變得非常輕松(比如可以使用 Pool 的 map 接口,簡(jiǎn)潔高效)。
分布式:multiprocessing 中的 Managers 類提供了可以在不同進(jìn)程之共享數(shù)據(jù)的方式,可以在此基礎(chǔ)上開發(fā)出分布式的程序。
不同的業(yè)務(wù)場(chǎng)景可以選擇其中的一種或幾種的組合實(shí)現(xiàn)程序性能的優(yōu)化。
(5)使用性能分析工具
除了上面在 ipython 使用到的 timeit 模塊,還有 cProfile。cProfile 的使用方式也非常簡(jiǎn)單: python-mcProfilefilename.py,filename.py 是要運(yùn)行程序的文件名,可以在標(biāo)準(zhǔn)輸出中看到每一個(gè)函數(shù)被調(diào)用的次數(shù)和運(yùn)行的時(shí)間,從而找到程序的性能瓶頸,然后可以有針對(duì)性地優(yōu)化。
(6)set 的用法
set 的 union,intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的問題可以轉(zhuǎn)換為 set 來操作。
(7)PyPy
PyPy 是用 RPython(CPython 的子集)實(shí)現(xiàn)的 Python,根據(jù)官網(wǎng)的基準(zhǔn)測(cè)試數(shù)據(jù),它比 CPython 實(shí)現(xiàn)的 Python 要快 6 倍以上。快的原因是使用了 Just-in-Time(JIT)編譯器,即動(dòng)態(tài)編譯器,與靜態(tài)編譯器(如 gcc,javac 等)不同,它是利用程序運(yùn)行的過程的數(shù)據(jù)進(jìn)行優(yōu)化。由于歷史原因,目前 pypy 中還保留著 GIL,不過正在進(jìn)行的 STM 項(xiàng)目試圖將 PyPy 變成沒有 GIL 的 Python。如果 python 程序中含有 C 擴(kuò)展(非 cffi 的方式),JIT 的優(yōu)化效果會(huì)大打折扣,甚至比 CPython 慢(比 Numpy)。所以在 PyPy 中最好用純 Python 或使用 cffi 擴(kuò)展。

20.Django 中間件是如何使用的
中間件不用繼承自任何類(可以繼承 object),下面一個(gè)中間件大概的樣子:
class CommonMiddleware(object):
def process_request(self, request):
return None
def process_response(self, request, response):
return response
還有 process_view, process_exception 和 process_template_response 函數(shù)
1)初始化:無需任何參數(shù),服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用一次,用于確定是否啟用當(dāng)前中間件。
def init (self):
pass
2)處理請(qǐng)求前:在每個(gè)請(qǐng)求上,request 對(duì)象產(chǎn)生之后,url 匹配之前調(diào)用,返回 None 或HttpResponse 對(duì)象。
def process_request(self, request):
pass
3)處理視圖前:在每個(gè)請(qǐng)求上,url 匹配之后,視圖函數(shù)調(diào)用之前調(diào)用,返回 None 或
HttpResponse 對(duì)象。
def process_view(self, request, view_func, *view_args,**view_kwargs):
pass
4)處理響應(yīng)后:視圖函數(shù)調(diào)用之后,所有響應(yīng)返回瀏覽器之前被調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回HttpResponse 對(duì)象。
def process_response(self, request, response):
pass
5)異常處理:當(dāng)視圖拋出異常時(shí)調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回一個(gè) HttpResponse 對(duì)象。
def process_exception(self, request,exception):
pass

21.有用過 Django REST framework 嗎
Django REST framework 是一個(gè)強(qiáng)大而靈活的 Web API 工具。使用 RESTframework 的理由有:
Web browsable API 對(duì)開發(fā)者有極大的好處包括 OAuth1a 和 OAuth2 的認(rèn)證策略
支持 ORM 和非 ORM 數(shù)據(jù)資源的序列化
全程自定義開發(fā)——如果不想使用更加強(qiáng)大的功能,可僅僅使用常規(guī)的 function-based views 額外的文檔和強(qiáng)大的社區(qū)支持

22.Celery 分布式任務(wù)隊(duì)列
情景:用戶發(fā)起 request,并等待 response 返回。在本些 views 中,可能需要執(zhí)行一段耗時(shí)的程序,那么用戶就會(huì)等待很長(zhǎng)時(shí)間,造成不好的用戶體驗(yàn),比如發(fā)送郵件、手機(jī)驗(yàn)證碼等。
使用 celery 后,情況就不一樣了。解決:將耗時(shí)的程序放到 celery 中執(zhí)行。
將多個(gè)耗時(shí)的任務(wù)添加到隊(duì)列 queue 中,也就是用 redis 實(shí)現(xiàn) broker 中間人,然后用多個(gè) worker 去監(jiān)聽隊(duì)列里的任務(wù)去執(zhí)行。

· 任務(wù) task:就是一個(gè) Python 函數(shù)。
· 隊(duì)列 queue:將需要執(zhí)行的任務(wù)加入到隊(duì)列中。
· 工人 worker:在一個(gè)新進(jìn)程中,負(fù)責(zé)執(zhí)行隊(duì)列中的任務(wù)。
· 代理人 broker:負(fù)責(zé)調(diào)度,在布置環(huán)境中使用 redis。

23.Jieba 分詞
Jieba 分詞支持三種分詞模式:
精確模式:試圖將句子最精確地切開,適合文本分析;
全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞功能:
分詞,添加自定義詞典,關(guān)鍵詞提取,詞性標(biāo)注,并行分詞,Tokenize:返回詞語在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎。

24.ngnix 的正向代理與反向代理
web 開發(fā)中,部署方式大致類似。簡(jiǎn)單來說,使用 Nginx 主要是為了實(shí)現(xiàn)分流、轉(zhuǎn)發(fā)、負(fù)載均衡, 以及分擔(dān)服務(wù)器的壓力。Nginx 部署簡(jiǎn)單,內(nèi)存消耗少,成本低。Nginx 既可以做正向代理,也可以做反向代理。
正向代理:請(qǐng)求經(jīng)過代理服務(wù)器從局域網(wǎng)發(fā)出,然后到達(dá)互聯(lián)網(wǎng)上的服務(wù)器。特點(diǎn):服務(wù)端并不知道真正的客戶端是誰。
反向代理:請(qǐng)求從互聯(lián)網(wǎng)發(fā)出,先進(jìn)入代理服務(wù)器,再轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的服務(wù)器。特點(diǎn):客戶端并不知道真正的服務(wù)端是誰。
區(qū)別:正向代理的對(duì)象是客戶端。反向代理的對(duì)象是服務(wù)端。

25.簡(jiǎn)述 Django 下的(內(nèi)建的)緩存機(jī)制
一個(gè)動(dòng)態(tài)網(wǎng)站的基本權(quán)衡點(diǎn)就是,它是動(dòng)態(tài)的。 每次用戶請(qǐng)求頁面,服務(wù)器會(huì)重新計(jì)算。從開銷處理的角度來看,這比你讀取一個(gè)現(xiàn)成的標(biāo)準(zhǔn)文件的代價(jià)要昂貴的多。
這就是需要緩存的地方。
Django 自帶了一個(gè)健壯的緩存系統(tǒng)來保存動(dòng)態(tài)頁面這樣避免對(duì)于每次請(qǐng)求都重新計(jì)算。方便起見,
Django 提供了不同級(jí)別的緩存粒度:可以緩存特定視圖的輸出、可以僅僅緩存那些很難生產(chǎn)出來的部分、或者可以緩存整個(gè)網(wǎng)站 Django 也能很好的配合那些“下游”緩存, 比如 Squid 和基于瀏覽器的緩存。這里有一些緩存不必要直接去控制但是可以提供線索, (via HTTPheaders)關(guān)于網(wǎng)站哪些部分需要緩存和如何緩存。
設(shè)置緩存:
緩存系統(tǒng)需要一些設(shè)置才能使用。 也就是說,你必須告訴他你要把數(shù)據(jù)緩存在哪里- 是數(shù)據(jù)庫(kù)中, 文件系統(tǒng)或者直接在內(nèi)存中。 這個(gè)決定很重要,因?yàn)樗鼤?huì)影響你的緩存性能,是的,一些緩存類型要比其他的緩存類型更快速。
你的緩存配置是通過 setting 文件的 CACHES 配置來實(shí)現(xiàn)的。這里有 CACHES 所有可配置的變量值。

26.請(qǐng)簡(jiǎn)述瀏覽器是如何獲取一枚網(wǎng)頁的
(1)在用戶輸入目的 URL 后,瀏覽器先向 DNS 服務(wù)器發(fā)起域名解析請(qǐng)求;
(2)在獲取了對(duì)應(yīng)的 IP 后向服務(wù)器發(fā)送請(qǐng)求數(shù)據(jù)包;
(3)服務(wù)器接收到請(qǐng)求數(shù)據(jù)后查詢服務(wù)器上對(duì)應(yīng)的頁面,并將找到的頁面代碼回復(fù)給客戶端;
(4)客戶端接收到頁面源代碼后,檢查頁面代碼中引用的其他資源,并再次向服務(wù)器請(qǐng)求該資源;
(5)在資源接收完成后,客戶端瀏覽器按照頁面代碼將頁面渲染輸出顯示在顯示器上;

27.對(duì) cookie與session 的了解?他們能單獨(dú)用嗎
Session 采用的是在服務(wù)器端保持狀態(tài)的方案,而 Cookie 采用的是在客戶端保持狀態(tài)的方案。但是禁用 Cookie 就不能得到 Session。因?yàn)?Session 是用 Session ID 來確定當(dāng)前對(duì)話所對(duì)應(yīng)的服務(wù)器 Session,而 Session ID 是通過 Cookie 來傳遞的,禁用 Cookie 相當(dāng)于失去了 SessionID,也就得不到 Session。

28.Django HTTP 請(qǐng)求的處理流程
Django 和其他 Web 框架的 HTTP 處理的流程大致相同,Django 處理一個(gè) Request 的過程是首先通過中間件,然后再通過默認(rèn)的 URL 方式進(jìn)行的。我們可以在 Middleware 這個(gè)地方把所有
Request 攔截住,用我們自己的方式完成處理以后直接返回 Response。
(1)加載配置
Django 的配置都在 “Project/settings.py” 中定義,可以是 Django 的配置,也可以是自定義的配置,并且都通過 django.conf.settings 訪問,非常方便。
(2)啟動(dòng)
最核心動(dòng)作的是通過 django.core.management.commands.runfcgi 的 Command 來啟動(dòng), 它運(yùn)行 django.core.servers.fastcgi 中的 runfastcgi,runfastcgi 使用了 flup 的 WSGIServer來啟動(dòng) fastcgi 。而 WSGIServer 中攜帶了 django.core.handlers.wsgi 的 WSGIHandler 類的一個(gè)實(shí)例,通過 WSGIHandler 來處理由 Web 服務(wù)器(比如 Apache,Lighttpd 等)傳過來的請(qǐng)求,此時(shí)才是真正進(jìn)入 Django 的世界。
(3)處 理 Request
當(dāng)有 HTTP 請(qǐng)求來時(shí),WSGIHandler 就開始工作了,它從 BaseHandler 繼承而來。
WSGIHandler 為每個(gè)請(qǐng)求創(chuàng)建一個(gè) WSGIRequest 實(shí)例,而 WSGIRequest 是從
http.HttpRequest 繼承而來。接下來就開始創(chuàng)建 Response 了。
(4)創(chuàng) 建 Response
BaseHandler 的 get_response 方法就是根據(jù) request 創(chuàng)建 response,而具體生成
response 的動(dòng)作就是執(zhí)行 urls.py 中對(duì)應(yīng)的 view 函數(shù)了,這也是 Django 可以處理“友好 URL ” 的關(guān)鍵步驟,每個(gè)這樣的函數(shù)都要返回一個(gè) Response 實(shí)例。此時(shí)一般的做法是通過 loader 加載template 并生成頁面內(nèi)容,其中重要的就是通過 ORM 技術(shù)從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),并渲染到Template 中,從而生成具體的頁面了。
(5)處 理 Response
Django 返回 Response 給 flup,flup 就取出 Response 的內(nèi)容返回給 Web 服務(wù)器,由后者返回給瀏覽器。
總之,Django 在 fastcgi 中主要做了兩件事:處理 Request 和創(chuàng)建 Response,而它們對(duì)應(yīng)的核心就是“ urls 分析”、“模板技術(shù)”和“ ORM 技術(shù)”。

如圖所示,一個(gè) HTTP 請(qǐng)求,首先被轉(zhuǎn)化成一個(gè) HttpRequest 對(duì)象,然后該對(duì)象被傳遞給Request 中間件處理,如果該中間件返回了 Response,則直接傳遞給 Response 中間件做收尾處理。否則的話 Request 中間件將訪問 URL 配置,確定哪個(gè) view 來處理,在確定了哪個(gè) view 要執(zhí)行,但是還沒有執(zhí)行該 view 的時(shí)候,系統(tǒng)會(huì)把 request 傳遞給 view 中間件處理器進(jìn)行處理,如果該中間件返回了 Response,那么該 Response 直接被傳遞給 Response 中間件進(jìn)行后續(xù)處理,否則將執(zhí)行確定的 view 函數(shù)處理并返回 Response,在這個(gè)過程中如果引發(fā)了異常并拋出,會(huì)被 Exception 中間件處理器進(jìn)行處理。

29.Django里QuerySet的get和filter方法的區(qū)別
(1) 輸入?yún)?shù)
get 的參數(shù)只能是 model 中定義的那些字段,只支持嚴(yán)格匹配。
filter 的參數(shù)可以是字段,也可以是擴(kuò)展的 where 查詢關(guān)鍵字,如 in,like 等。

(2)返回值
get 返回值是一個(gè)定義的 model 對(duì)象。
filter 返回值是一個(gè)新的 QuerySet 對(duì)象,然后可以對(duì) QuerySet 在進(jìn)行查詢返回新的 QuerySet 對(duì)象,支持鏈?zhǔn)讲僮?#xff0c;QuerySet 一個(gè)集合對(duì)象,可使用迭代或者遍歷,切片等,但是不等于 list 類型
(使用一定要注意)。

(3) 異常
get 只有一條記錄返回的時(shí)候才正常,也就說明 get 的查詢字段必須是主鍵或者唯一約束的字段。當(dāng)返回多條記錄或者是沒有找到記錄的時(shí)候都會(huì)拋出異常
filter 有沒有匹配的記錄都可以

30.django 中當(dāng)一個(gè)用戶登錄 A 應(yīng)用服務(wù)器(進(jìn)入登錄狀態(tài)),然后下次請(qǐng)求被 nginx代理到 B 應(yīng)用服務(wù)器會(huì)出現(xiàn)什么影響?
如果用戶在 A 應(yīng)用服務(wù)器登陸的 session 數(shù)據(jù)沒有共享到 B 應(yīng)用服務(wù)器,那么之前的登錄狀態(tài)就沒有了。

31.跨域請(qǐng)求問題 django 怎么解決的
啟用中間件
post 請(qǐng)求
驗(yàn)證碼
表單中添加 csrf_token 標(biāo)簽

32.Django對(duì)數(shù)據(jù)查詢結(jié)果排序怎么做,降序怎么做,查詢大于某個(gè)字段怎么做
排序使用 order_by()
降序需要在排序字段名前加-
查詢字段大于某個(gè)值:使用 filter(字段名_gt=值)

33.Django 重定向你是如何實(shí)現(xiàn)的?用的什么狀態(tài)碼
使用 HttpResponseRedirect
redirect 和 reverse
狀態(tài)碼:302,301

34.生成遷移文件和執(zhí)行遷移文件的命令是什么
python manage.py makemigrations
python manage.py migrate
35.關(guān)系型數(shù)據(jù)庫(kù)的關(guān)系包括哪些類型
· ForeignKey:一對(duì)多,將字段定義在多的一端中。
· ManyToManyField:多對(duì)對(duì):將字段定義在兩端中。
· OneToOneField:一對(duì)一,將字段定義在任意一端中。

36.查詢集返回列表的過濾器有哪些?
all() :返回所有的數(shù)據(jù)
filter():返回滿足條件的數(shù)據(jù)
exclude():返回滿足條件之外的數(shù)據(jù),相當(dāng)于 sql 語句中 where 部分的 not 關(guān)鍵字
order_by():排序

37.判斷查詢集正是否有數(shù)據(jù)?
exists():判斷查詢集中否有數(shù)據(jù),如果有則返回 True,沒有則返回 False。

  • Django 本身提供了 runserver,為什么不能用來部署?
    runserver 方法是調(diào)試 Django 時(shí)經(jīng)常用到的運(yùn)行方式,它使用 Django 自帶的 WSGI Server 運(yùn)行,主要在測(cè)試和開發(fā)中使用,并且 runserver 開啟的方式也是單進(jìn)程 。
    uWSGI 是一個(gè) Web 服務(wù)器,它實(shí)現(xiàn)了 WSGI 協(xié)議、uwsgi、http 等協(xié)議。注意 uwsgi 是一種通信協(xié)議,而 uWSGI 是實(shí)現(xiàn) uwsgi 協(xié)議和 WSGI 協(xié)議的 Web 服務(wù)器。uWSGI 具有超快的性能、低內(nèi)存占用和多 app 管理等優(yōu)點(diǎn),并且搭配著 Nginx 就是一個(gè)生產(chǎn)環(huán)境了,能夠?qū)⒂脩粼L問請(qǐng)求與應(yīng)用 app 隔離開,實(shí)現(xiàn)真正的部署。相比來講,支持的并發(fā)量更高,方便管理多進(jìn)程,發(fā)揮多核的優(yōu)勢(shì), 提升性能。

  • apache 和 nginx 的區(qū)別
    Nginx 相對(duì) Apache 的優(yōu)點(diǎn):
    輕量級(jí),同樣起 web 服務(wù),比 apache 占用更少的內(nèi)存及資源;
    抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞的,支持更多的并發(fā)連接,而 apache 則是阻塞型的,在高并發(fā)下 nginx 能保持低資源低消耗高性能;
    配置簡(jiǎn)潔;
    高度模塊化的設(shè)計(jì),編寫模塊相對(duì)簡(jiǎn)單; 社區(qū)活躍。
    Apache 相對(duì) Nginx 的優(yōu)點(diǎn):
    rewrite ,比 nginx 的 rewrite 強(qiáng)大; 模塊超多,基本想到的都可以找到;
    少 bug ,nginx 的 bug 相對(duì)較多; 超穩(wěn)定。

  • varchar 與 char 的區(qū)別?
    char 長(zhǎng)度是固定的,不管你存儲(chǔ)的數(shù)據(jù)是多少他都會(huì)都固定的長(zhǎng)度。而 varchar 則處可變長(zhǎng)度但他要在總長(zhǎng)度上加 1 字符,這個(gè)用來存儲(chǔ)位置。所以在處理速度上 char 要比 varchar 快速很多,但是對(duì)費(fèi)存儲(chǔ)空間,所以對(duì)存儲(chǔ)不大,但在速度上有要求的可以使用 char 類型,反之可以用 varchar 類型。

  • 41.查詢集兩大特性?惰性執(zhí)行
    惰性執(zhí)行、緩存 。
    創(chuàng)建查詢集不會(huì)訪問數(shù)據(jù)庫(kù),直到調(diào)用數(shù)據(jù)時(shí),才會(huì)訪問數(shù)據(jù)庫(kù),調(diào)用數(shù)據(jù)的情況包括迭代、序列化、與 if 合用

    42.git 常用命令
    git clone 克隆指定倉(cāng)庫(kù)
    git status 查看當(dāng)前倉(cāng)庫(kù)狀態(tài)git diff 比較版本的區(qū)別
    git log 查看 git 操作日志git reset 回溯歷史版本
    git add 將文件添加到暫存區(qū)
    git commit 將文件提交到服務(wù)器git checkout 切換到指定分支git rm 刪除指定文件

    43.電商網(wǎng)站庫(kù)存問題
    一般團(tuán)購(gòu),秒殺,特價(jià)之類的活動(dòng),這樣會(huì)使訪問量激增,很多人搶購(gòu)一個(gè)商品,作為活動(dòng)商品, 庫(kù)存肯定是很有限的。控制庫(kù)存問題,數(shù)據(jù)庫(kù)的事務(wù)功能是控制庫(kù)存超賣的有效方式。
    (1)在秒殺的情況下,肯定不能如此頻率的去讀寫數(shù)據(jù)庫(kù),嚴(yán)重影響性能問題,必須使用緩存,將需要秒殺的商品放入緩存中,并使用鎖來處理并發(fā)情況,先將商品數(shù)量增減(加鎖、解析)后在進(jìn)行其他方面的處理,處理失敗再將數(shù)據(jù)遞增(加鎖、解析),否則表示交易成功。
    (2)這個(gè)肯定不能直接操作數(shù)據(jù)庫(kù)的,會(huì)掛的。直接讀庫(kù)寫庫(kù)對(duì)數(shù)據(jù)庫(kù)壓力太大了,要用到緩存。
    (3)首先,多用戶并發(fā)修改同一條記錄時(shí),肯定是后提交的用戶將覆蓋掉前者提交的結(jié)果了。這個(gè)直接可以使用加樂觀鎖的機(jī)制去解決高并發(fā)的問題。

  • HttpRequest 和 HttpResponse 是什么?干嘛用的?
    HttpRequest 是 django 接受用戶發(fā)送多來的請(qǐng)求報(bào)文后,將報(bào)文封裝到 HttpRequest 對(duì)象中去。
    HttpResponse 返回的是一個(gè)應(yīng)答的數(shù)據(jù)報(bào)文。render 內(nèi)部已經(jīng)封裝好了 HttpResponse 類。視圖的第一個(gè)參數(shù)必須是 HttpRequest 對(duì)象,兩點(diǎn)原因:表面上說,他是處理 web 請(qǐng)求的,所以
    必須是請(qǐng)求對(duì)象,根本上說,他是基于請(qǐng)求的一種 web 框架,所以,必須是請(qǐng)求對(duì)象。
    因?yàn)?view 處理的是一個(gè) request 對(duì)象,請(qǐng)求的所有屬性我們都可以根據(jù)對(duì)象屬性的查看方法來獲取具體的信息:格式:request.屬性
    request.path 請(qǐng)求頁面的路徑,不包含域名
    request.get_full_path 獲取帶參數(shù)的路徑
    request.method 頁面的請(qǐng)求方式request.GET GET 請(qǐng)求方式的數(shù)據(jù)request.POST POST 請(qǐng)求
    request.COOKIES 獲取 cookie
    request.session 獲取 session
    request.FILES 上傳圖片(請(qǐng)求頁面有 enctype=“multipart/form-data"屬性時(shí) FILES 才有數(shù)據(jù)。
    ?a=10 的鍵和值時(shí)怎么產(chǎn)生的,鍵是開發(fā)人員在編寫代碼時(shí)確定下來的,值時(shí)根據(jù)數(shù)據(jù)生成或者用戶填寫的,總之是不確定的。
    403 錯(cuò)誤:表示資源不可用,服務(wù)器理解客戶的請(qǐng)求,但是拒絕處理它,通常由于服務(wù)器上文件和目錄的權(quán)限設(shè)置導(dǎo)致的 web 訪問錯(cuò)誤。如何解決:1、把中間件注釋。2、在表單內(nèi)部添加{% scrf_token %}
    request.GET.get()取值時(shí)如果一鍵多值情況,get 是覆蓋的方式獲取的。getlist()可以獲取多個(gè)值。在一個(gè)有鍵無值的情況下,該鍵名 c 的值返回空。有鍵無值:c: getlist 返回的是列表,空列表
    在無鍵無值也沒有默認(rèn)值的情況下,返回的是 None 無鍵無值:e:None
    HttpResponse 常見屬性:
    content: 表 示 返 回 的 內(nèi) 容charset: 表 示 response 采 用 的 編 碼 字 符 集 , 默 認(rèn) 是 utf-8 status_code:返回的 HTTP 響應(yīng)狀態(tài)碼 3XX 是對(duì)請(qǐng)求繼續(xù)進(jìn)一步處理,常見的是重定向。常見方法:
    init:創(chuàng)建 httpResponse 對(duì)象完成返回內(nèi)容的初始化
    set_cookie:設(shè)置 Cookie 信息:格式:set_cookies(‘key’,‘value’,max_age=None,expires=None) max_age 是一個(gè)整數(shù),表示指定秒數(shù)后過期,expires 指定過期時(shí)間,默認(rèn)兩個(gè)星期后過期。
    write 向響應(yīng)體中寫數(shù)據(jù)應(yīng)答對(duì)象:
    方式一:render(request,“index.html”) 返回一個(gè)模板render(request,“index.html”, context) 返回一個(gè)攜帶動(dòng)態(tài)數(shù)據(jù)的頁面
    方式二:render_to_response(“index.html”) 返回一個(gè)模板頁面方式三:redirect(”/") 重定向
    方式四:HttpResponseRdeirect("/") 實(shí)現(xiàn)頁面跳轉(zhuǎn)功能
    方式五:HttpResponse(“itcast1.0”)在返回到額頁面中添加字符串內(nèi)容方式六:HttpResponseJson() 返回的頁面中添加字符串內(nèi)容。
    JsonResponse 創(chuàng)建對(duì)象時(shí)候接收字典作為參數(shù),返回的對(duì)象是一個(gè) json 對(duì)象。
    能接收 Json 格式數(shù)據(jù)的場(chǎng)景,都需要使用 view 的 JsonResponse 對(duì)象返回一個(gè) json 格式數(shù)據(jù)
    ajax 的使用場(chǎng)景,頁面局部刷新功能。ajax 接收 Json 格式的數(shù)據(jù)。
    在返回的應(yīng)答報(bào)文中,可以看到 JsonResponse 應(yīng)答的 content-Type 內(nèi)容是 application/json
    ajax 實(shí)現(xiàn)網(wǎng)頁局部刷新功能:ajax 的 get()方法獲取請(qǐng)求數(shù)據(jù) ajax 的 each()方法遍歷輸出這些數(shù)據(jù)
  • 45.什么是反向解析
    使用場(chǎng)景:模板中的超鏈接,視圖中的重定向
    使用:在定義 url 時(shí)為 include 定義 namespace 屬性,為 url 定義 name 屬性在模板中使用 url 標(biāo)簽:{% url ‘namespace_value:name_value’%}
    在視圖中使用 reverse 函數(shù):redirect(reverse('namespce_value:name_value’))根據(jù)正則表達(dá)式動(dòng)態(tài)生成地址,減輕后期維護(hù)成本。
    注意反向解析傳參數(shù),主要是在我們的反向解析的規(guī)則后面天界了兩個(gè)參數(shù),兩個(gè)參數(shù)之間使用空格隔開:位置參數(shù)

    46.Django 日志管理
    配置好之后:
    import logging
    logger=logging.getLogger( name ) # 為 loggers 中定義的名稱
    logger.info("some info …)
    可用函數(shù)有:logger.debug() logger.info() logger.warning() logger.error()
    Django 文件管理:對(duì)于 django 老說,項(xiàng)目中的 css,js,圖片都屬于靜態(tài)文件,我們一般會(huì)將靜態(tài)文件放到一個(gè)單獨(dú)的目錄中,以方便管理,在 html 頁面調(diào)用時(shí),也需要指定靜態(tài)文件的路徑。靜態(tài)文件可以放在項(xiàng)目根目錄下,也可以放在應(yīng)用的目錄下,由于這些靜態(tài)文件在項(xiàng)目中是通用的,所以推薦放在項(xiàng)目的根目錄下。
    在生產(chǎn)中,只要和靜態(tài)文件相關(guān)的,所有訪問,基本上沒有 django 什么事,一般都是由 nignx 軟件代勞了,為什么?因?yàn)?nginx 就是干這個(gè)的。

    總結(jié)

    以上是生活随笔為你收集整理的Django框架基础知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。