1、談?wù)剬?duì)http協(xié)議的認(rèn)識(shí)
流程:
1.域名解析
域名解析檢查順序?yàn)椋簽g覽器自身DNS緩存---》OS自身的DNS緩存--》讀取host文件--》本地域名服務(wù)器--》權(quán)限域名服務(wù)器--》根域名服務(wù)器奋献。如果有且沒(méi)有過(guò)期诫隅,則結(jié)束本次域名解析钾怔。域名解析成功之后鳍刷,進(jìn)行后續(xù)操作
2.tcp3次握手建立連接
3.建立連接后租漂,發(fā)起http請(qǐng)求
4.服務(wù)器端響應(yīng)http請(qǐng)求喇伯,瀏覽器得到到http請(qǐng)求的內(nèi)容
5.瀏覽器解析html代碼喊儡,并請(qǐng)求html代碼中的資源
6.瀏覽器對(duì)頁(yè)面進(jìn)行渲染,展現(xiàn)在用戶面前
2稻据、談?wù)剬?duì)websocket協(xié)議的認(rèn)識(shí)
WebSocket是HTML5開(kāi)始提供的一種瀏覽器與服務(wù)器間進(jìn)行全雙工通訊的網(wǎng)絡(luò)技術(shù)艾猜。依靠這種技術(shù)可以實(shí)現(xiàn)客戶端和服務(wù)器端的長(zhǎng)連接,雙向?qū)崟r(shí)通信捻悯。
特點(diǎn):
事件驅(qū)動(dòng)
異步
使用ws或者wss協(xié)議的客戶端socket
能夠?qū)崿F(xiàn)真正意義上的推送功能
缺點(diǎn):
少部分瀏覽器不支持匆赃,瀏覽器支持的程度與方式有區(qū)別。
http://www.cnblogs.com/best/p/5695570.html#_label1
3今缚、什么是magic string
4算柳、如何創(chuàng)建響應(yīng)式布局
@media (min-width: 768px){
.pg-header{
background-color: green;
}
}
@media (min-width: 992px){
.pg-header{
background-color: pink;
}
}
5、什么是ajax請(qǐng)求姓言,并使用jquery和XMLHttpRequest對(duì)象實(shí)現(xiàn)一個(gè)ajax請(qǐng)求
<script>
function JqSendRequest(){
$.ajax({
url: "http://c2.com:8000/test/",
type: 'GET',
dataType: 'text',
success: function(data, statusText, xmlHttpRequest){
console.log(data);
}
})
}
</script>
http://www.cnblogs.com/wupeiqi/articles/5703697.html
6瞬项、如何在前端實(shí)現(xiàn)輪詢
輪詢:客戶端定時(shí)向服務(wù)器發(fā)送Ajax請(qǐng)求,服務(wù)器接到請(qǐng)求后馬上返回響應(yīng)信息并關(guān)閉連接何荚。
優(yōu)點(diǎn):后端程序編寫(xiě)比較容易囱淋。 缺點(diǎn):請(qǐng)求中有大半是無(wú)用,浪費(fèi)帶寬和服務(wù)器資源餐塘。 實(shí)例:適于小型應(yīng)用绎橘。
https://www.cnblogs.com/zhaowinter/p/5332681.html
7、如何在前端實(shí)現(xiàn)長(zhǎng)輪詢
客戶端向服務(wù)器發(fā)送Ajax請(qǐng)求唠倦,服務(wù)器接到請(qǐng)求后hold住連接称鳞,直到有新消息才返回響應(yīng)信息并關(guān)閉連接,客戶端處理完響應(yīng)信息后再向服務(wù)器發(fā)送新的請(qǐng)求稠鼻。
優(yōu)點(diǎn):在無(wú)消息的情況下不會(huì)頻繁的請(qǐng)求冈止,耗費(fèi)資小。
缺點(diǎn):服務(wù)器hold連接會(huì)消耗資源候齿,返回?cái)?shù)據(jù)順序無(wú)保證熙暴,難于管理維護(hù)。 Comet異步的ashx慌盯,
實(shí)例:WebQQ周霉、Hi網(wǎng)頁(yè)版、Facebook IM亚皂。
8俱箱、vuex的作用
在使用庫(kù)或框架時(shí),需要注意一個(gè)「適用性」的問(wèn)題灭必。
Vuex 或者說(shuō)實(shí)現(xiàn)了 Flux 思想的庫(kù)狞谱,解決了幾個(gè)問(wèn)題:
組件之間的數(shù)據(jù)通信
使用單向數(shù)據(jù)流的方式進(jìn)行數(shù)據(jù)的中心化管理
為什么要解決這樣的問(wèn)題呢乃摹?其實(shí)是因?yàn)楫?dāng)程序邏輯過(guò)于復(fù)雜的時(shí)候,非中心化的數(shù)據(jù)管理會(huì)讓整個(gè) app 的邏輯非掣疲混亂孵睬。
舉一個(gè)不使用中心化的數(shù)據(jù)管理機(jī)制的具體例子:
一個(gè) app ,有四個(gè) tab伶跷,每個(gè) tab 都需要讀取用戶的資料掰读。如果數(shù)據(jù)在每個(gè) tab 的控制器里(或者說(shuō)組件里)都存了一份,那么在用戶手動(dòng)更新了用戶資料之后叭莫,就需要在每一個(gè) tab 里都更新一遍用戶資料蹈集,才能保證用戶看到的永遠(yuǎn)是最新的資料。
如你問(wèn)題里所說(shuō)食寡,我每進(jìn)一個(gè) tab 的時(shí)候重新請(qǐng)求一下不就好了嗎雾狈?
這樣的解決方案不是不可以,但弊端也非常明顯:
- 對(duì)于服務(wù)器端來(lái)說(shuō)抵皱,頻繁的請(qǐng)求是非常占用資源的善榛,如果你的 app 用戶足夠多,那么每多出一個(gè)請(qǐng)求呻畸,對(duì)公司來(lái)說(shuō)移盆,都是一大筆錢(qián)。如果數(shù)據(jù)存在了 store 中伤为,并且所有的 tab 都讀取同一份數(shù)據(jù)咒循,在用戶更新資料時(shí),在前端更新了 store 中的數(shù)據(jù)绞愚,是不是在切換 tab 時(shí)就減少了四個(gè)請(qǐng)求呢叙甸?
- 對(duì)于前端開(kāi)發(fā)者來(lái)說(shuō),如果你的項(xiàng)目足夠復(fù)雜位衩,團(tuán)隊(duì)的規(guī)模也不僅是一個(gè)人裆蒸,那么前端代碼就會(huì)因?yàn)閿?shù)據(jù)分散管理而產(chǎn)生非常嚴(yán)重的性能和穩(wěn)定性的隱患(比如你的同事覺(jué)得進(jìn)入模塊就刷新用戶資料太慢了,手賤把刷新的代碼刪了糖驴,你又沒(méi)發(fā)現(xiàn))僚祷。
https://segmentfault.com/q/1010000011402824
9、Vue中路由的攔截器作用
vue-resource的interceptors攔截器的作用正是解決此需求的妙方贮缕。在每次http的請(qǐng)求響應(yīng)之后辙谜,如果設(shè)置了攔截器如下,會(huì)優(yōu)先執(zhí)行攔截器函數(shù)感昼,獲取響應(yīng)體装哆,然后才會(huì)決定是否把response返回給then進(jìn)行接收
10、axios的作用
https://blog.csdn.net/qq_27626333/article/details/76254888
11、列舉vue中常見(jiàn)的指令
1烂琴、v-if指令:判斷指令爹殊,根據(jù)表達(dá)式值得真假來(lái)插入或刪除相應(yīng)的值蜕乡。
2奸绷、v-show指令:條件渲染指令,無(wú)論返回的布爾值是true還是false层玲,元素都會(huì)存在在html中号醉,只是false的元素會(huì)隱藏在html中,并不會(huì)刪除.
3辛块、v-else指令:配合v-if或v-else使用畔派。
4、v-for指令:循環(huán)指令润绵,相當(dāng)于遍歷线椰。
5、v-bind:給DOM綁定元素屬性尘盼。
6憨愉、v-on指令:監(jiān)聽(tīng)DOM事件。
12卿捎、簡(jiǎn)述jsonp及實(shí)現(xiàn)原理
JSONP是json用來(lái)跨域的一個(gè)東西配紫。原理是通過(guò)script標(biāo)簽的跨域特性來(lái)繞過(guò)同源策略。(創(chuàng)建一個(gè)回調(diào)函數(shù)午阵,然后在遠(yuǎn)程服務(wù)上調(diào)用這個(gè)函數(shù)并且將json數(shù)據(jù)形式作為參數(shù)傳遞躺孝,完成回調(diào))。
http://www.cnblogs.com/huchong/p/8469053.html
13底桂、什么是cors
跨域資源共享(CORS植袍,Cross-Origin Resource Sharing),其本質(zhì)是設(shè)置響應(yīng)頭籽懦,使得瀏覽器允許跨域請(qǐng)求于个。
http://www.cnblogs.com/huchong/p/8469063.html
14、列舉http請(qǐng)求中常見(jiàn)的請(qǐng)求方式
請(qǐng)求方法有8種猫十,分別為:
GET:請(qǐng)求獲取由 Request-URI 所標(biāo)識(shí)的資源览濒。
POST:在 Request-URI 所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)。
HEAD:請(qǐng)求獲取由 Request-URI 所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭拖云。
OPTIONS:請(qǐng)求查詢服務(wù)器的性能领猾,或查詢與資源相關(guān)的選項(xiàng)和需求。
PUT:請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源艾栋,并用 Request-URI作為其標(biāo)識(shí)畅形。
DELETE:請(qǐng)求服務(wù)器刪除由 Request-URI所標(biāo)識(shí)的資源。
TRACE:請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用語(yǔ)測(cè)試或診斷汇荐。
CONNECT:HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器洞就。
15、列舉http請(qǐng)求中的狀態(tài)碼
常見(jiàn)的響應(yīng)狀態(tài)碼有以下幾種掀淘,在各種下面分別列幾個(gè)常見(jiàn)的狀態(tài)碼:
1開(kāi)頭(信息)
2開(kāi)頭(成功)
200(OK):請(qǐng)求成功
202(Accepted):已接受請(qǐng)求旬蟋,尚未處理
204(No Content):請(qǐng)求成功,且不需返回內(nèi)容
3開(kāi)頭(重定向)
301(Moved Permanently):被請(qǐng)求的資源已永久移動(dòng)到新位置
301(Moved Temporarily):被請(qǐng)求的資源已臨時(shí)移動(dòng)到新位置
4開(kāi)頭(客戶端錯(cuò)誤)
400(Bad Request):請(qǐng)求的語(yǔ)義或是參數(shù)有錯(cuò)
403(Forbidden):服務(wù)器拒絕了請(qǐng)求
404(Not Found):未找到請(qǐng)求的資源
5開(kāi)頭(服務(wù)器錯(cuò)誤)
500(Internal Server Error):服務(wù)器遇到錯(cuò)誤革娄,無(wú)法完成請(qǐng)求
502(Bad Getway):網(wǎng)關(guān)錯(cuò)誤倾贰,一般是服務(wù)器壓力過(guò)大導(dǎo)致連接超時(shí)
503(Service Unavailable):服務(wù)器宕機(jī)
16、列舉http請(qǐng)求中常見(jiàn)的請(qǐng)求頭
Accept:
瀏覽器端可以接受的媒體類(lèi)型,通配符 * 代表任意類(lèi)型
Accept-Encoding:
瀏覽器申明自己接收的編碼方法,例如: Accept-Encoding: zh-CN,zh;q=0.8
Accept-Language:
瀏覽器申明自己接收的語(yǔ)言,
Connection:
如Connection: keep-alive 當(dāng)一個(gè)網(wǎng)頁(yè)打開(kāi)完成后拦惋,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉匆浙,
如果客戶端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接厕妖。
Referer:
當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候首尼,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的言秸,服務(wù)器籍此可以獲得一些信息用于處理软能。
User-Agent:
告訴HTTP服務(wù)器, 客戶端使用的操作系統(tǒng)和瀏覽器的名稱(chēng)和版本.
Cookie:
Cookie是用來(lái)存儲(chǔ)一些用戶信息以便讓服務(wù)器辨別用戶身份的(大多數(shù)需要登錄的網(wǎng)站上面會(huì)比較常見(jiàn))井仰,比如cookie會(huì)存儲(chǔ)一些用戶的用戶名和密碼埋嵌,
當(dāng)用戶登錄后就會(huì)在客戶端產(chǎn)生一個(gè)cookie來(lái)存儲(chǔ)相關(guān)信息,這樣瀏覽器通過(guò)讀取cookie的信息去服務(wù)器上驗(yàn)證并通過(guò)后會(huì)判定你是合法用戶俱恶,從而允許查看相應(yīng)網(wǎng)頁(yè)雹嗦。
17、django合是、flask了罪、tornado框架對(duì)比
d:大而全
f:微型靈活
t:異步非阻塞
18、什么是wsgi
Python Web服務(wù)器網(wǎng)關(guān)接口(Python Web Server Gateway Interface聪全,縮寫(xiě)為WSGI)是Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口泊藕,已經(jīng)被廣泛接受, 它已基本達(dá)成它的可移植性方面的目標(biāo)。
http://python.jobbole.com/88653/
19难礼、django的請(qǐng)求生命周期
a. wsgi, 創(chuàng)建socket服務(wù)端娃圆,用于接收用戶請(qǐng)求并對(duì)請(qǐng)求進(jìn)行初次封裝。
b. 中間件蛾茉,對(duì)所有請(qǐng)求到來(lái)之前讼呢,響應(yīng)之前定制一些操作。
c. 路由匹配谦炬,在url和視圖函數(shù)對(duì)應(yīng)關(guān)系中悦屏,根據(jù)當(dāng)前請(qǐng)求url找到相應(yīng)的函數(shù)节沦。
d. 執(zhí)行視圖函數(shù),業(yè)務(wù)處理【通過(guò)ORM去數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)础爬,再去拿到模板甫贯,然后將數(shù)據(jù)和模板進(jìn)行渲染】
e. 再經(jīng)過(guò)所有中間件。
f. 通過(guò)wsgi將響應(yīng)返回給用戶看蚜。
20叫搁、列舉django中內(nèi)置的組件
form/modelform/admin
21、列舉django中間件的5個(gè)方法失乾,以及中間件的應(yīng)用場(chǎng)景
中間件中方法常熙?5個(gè)方法,分別是:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
1 請(qǐng)求先執(zhí)行所有中間件的process_request,然后做路由匹配纬乍,找到函數(shù)不執(zhí)行碱茁。
2 再執(zhí)行所有的process_view,在執(zhí)行視圖函數(shù)。
3 再執(zhí)行process_response
4 如果程序報(bào)錯(cuò)執(zhí)行process_exception
5 如果程序有render方法則執(zhí)行process_template_response
22仿贬、簡(jiǎn)述什么是FBV和CBV
1 FBV方式請(qǐng)求的過(guò)程
用戶發(fā)送url請(qǐng)求,Django會(huì)依次遍歷路由映射表中的所有記錄,一旦路由映射表其中的一條匹配成功了,
就執(zhí)行視圖函數(shù)中對(duì)應(yīng)的函數(shù)名,這是fbv的執(zhí)行流程
2 CBV方式請(qǐng)求的過(guò)程
當(dāng)服務(wù)端使用CBV模式的時(shí)候,用戶發(fā)給服務(wù)端的請(qǐng)求包含url和method,這兩個(gè)信息都是字符串類(lèi)型
服務(wù)端通過(guò)路由映射表匹配成功后會(huì)自動(dòng)去找dispatch方法,然后Django會(huì)通過(guò)dispatch反射的方式找到類(lèi)中對(duì)應(yīng)的方法并執(zhí)行
類(lèi)中的方法執(zhí)行完畢之后,會(huì)把客戶端想要的數(shù)據(jù)返回給dispatch方法,由dispatch方法把數(shù)據(jù)返回經(jīng)客戶端
把上面的例子中的視圖函數(shù)修改成如下:
from django.views import View
class CBV(View):
def dispatch(self, request, args, kwargs):
print("dispatch......")
res=super(CBV,self).dispatch(request,args,kwargs)
return res
def get(self,request):
return render(request, "cbv.html")
def post(self,request):
return HttpResponse("cbv.get")
3 FBV和CBV的區(qū)別纽竣?
- 沒(méi)什么區(qū)別,因?yàn)樗麄兊谋举|(zhì)都是函數(shù)茧泪。CBV的.as_view()返回的view函數(shù)蜓氨,view函數(shù)中調(diào)用類(lèi)的dispatch方法,在dispatch方法中通過(guò)反射執(zhí)行g(shù)et/post/delete/put等方法队伟。
- CBV比較簡(jiǎn)潔穴吹,GET/POST等業(yè)務(wù)功能分別放在不同get/post函數(shù)中。FBV自己做判斷進(jìn)行區(qū)分嗜侮。
http://www.cnblogs.com/renpingsheng/p/7534897.html
23港令、django的request對(duì)象什么時(shí)候創(chuàng)建
當(dāng)請(qǐng)求一個(gè)頁(yè)面時(shí), Django會(huì)建立一個(gè)包含請(qǐng)求元數(shù)據(jù)的 HttpRequest 對(duì)象. 當(dāng)Django 加載對(duì)應(yīng)的視圖時(shí), HttpRequest對(duì)象將作為視圖函數(shù)的第一個(gè)參數(shù). 每個(gè)視圖會(huì)返回一個(gè)HttpResponse對(duì)象.
https://blog.csdn.net/mbl114/article/details/78090773
24、如何給CBV添加裝飾器
-
裝飾器
from django.views import View
from django.utils.decorators import method_decoratordef auth(func):
def inner(args,kwargs):
return func(args,**kwargs)
return innerclass UserView(View):
@method_decorator(auth)
def get(self,request,args,*kwargs):
return HttpResponse('...')- csrf的裝飾器要加到dispath
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
- csrf的裝飾器要加到dispath
class UserView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return HttpResponse('...')
或
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@method_decorator(csrf_exempt,name='dispatch')
class UserView(View):
def dispatch(self, request, *args, **kwargs):
return HttpResponse('...')
24锈颗、列舉django orm中所有方法(QuerySet對(duì)象的所有方法)
返回QuerySet對(duì)象的方法有:
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet:
values() 返回一個(gè)可迭代的字典序列
values_list() 返回一個(gè)可迭代的元組序列
返回具體對(duì)象的:
get()
first()
last()
返回布爾值的方法有:
exists()
返回?cái)?shù)字的方法有:
count()
25顷霹、only和defer的區(qū)別
def defer(self, *fields):
models.UserInfo.objects.defer('username','id')
或
models.UserInfo.objects.filter(...).defer('username','id')
#映射中排除某列數(shù)據(jù)
def only(self, *fields):
#僅取某個(gè)表中的數(shù)據(jù)
models.UserInfo.objects.only('username','id')
或
models.UserInfo.objects.filter(...).only('username','id')
26、select_related和prefetch_related的區(qū)別
title = models.CharField(max_length=32)
class UserInfo(models.Model):
name = models.CharField(max_length=32)
email = models.CharField(max_length=32)
ut = models.ForeignKey(to='UserType')
ut = models.ForeignKey(to='UserType')
ut = models.ForeignKey(to='UserType')
ut = models.ForeignKey(to='UserType')
1次SQL
select * from userinfo
objs = UserInfo.obejcts.all()
for item in objs:
print(item.name)
n+1次SQL
select * from userinfo
objs = UserInfo.obejcts.all()
for item in objs:
# select * from usertype where id = item.id
print(item.name,item.ut.title)
示例1:
.select_related()
# 1次SQL
# select * from userinfo inner join usertype on userinfo.ut_id = usertype.id
objs = UserInfo.obejcts.all().select_related('ut')
for item in objs:
print(item.name,item.ut.title)
示例2:
.prefetch_related()
# select * from userinfo where id <= 8
# 計(jì)算:[1,2]
# select * from usertype where id in [1,2]
objs = UserInfo.obejcts.filter(id__lte=8).prefetch_related('ut')
for obj in objs:
print(obj.name,obj.ut.title)
兩個(gè)函數(shù)的作用都是減少查詢次數(shù)
27击吱、filter和exclude的區(qū)別
def filter(self, *args, **kwargs)
# 條件查詢(符合條件)
# 條件可以是:參數(shù)淋淀,字典,Q
def exclude(self, *args, **kwargs)
# 條件查詢(排除條件)
# 條件可以是:參數(shù)覆醇,字典朵纷,Q
28、列舉django orm中三種能寫(xiě)sql的方法
1.使用execute執(zhí)行自定義SQL
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()
2.使用extra方法
extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
3.使用raw方法
解釋?zhuān)簣?zhí)行原始sql并返回模型
說(shuō)明:依賴model多用于查詢
用法:
book = Book.objects.raw("select * from hello_book")
for item in book:
print(item.title)
https://www.cnblogs.com/413xiaol/p/6504856.html
29永脓、django orm如何設(shè)置讀寫(xiě)分離
class Router1:
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
All non-auth models end up in this pool.
"""
if db=='db1' and app_label == 'app02':
return True
elif db == 'default' and app_label == 'app01':
return True
else:
return False
# 如果返回None袍辞,那么表示交給后續(xù)的router,如果后續(xù)沒(méi)有router憨奸,則相當(dāng)于返回True
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'
30革屠、F和Q的作用
F:Django 支持 F() 對(duì)象之間以及 F() 對(duì)象和常數(shù)之間的加減乘除和取模的操作。
修改操作也可以使用F函數(shù),比如將每一本書(shū)的價(jià)格提高30元
例:把所有書(shū)名后面加上(第一版)
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.all().update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")")))
Q:
Q(條件1) | Q(條件2) 或
Q(條件1) & Q(條件2) 且
Q(條件1) & ~Q(條件2) 非
31、values和values_list的區(qū)別
values() 返回一個(gè)可迭代的字典序列
values_list() 返回一個(gè)可迭代的元組序列
32似芝、如何使用django orm批量創(chuàng)建數(shù)據(jù)
def bulk_create(self, objs, batch_size=None):
# 批量插入
# batch_size表示一次插入的個(gè)數(shù)
objs = [
models.DDD(name='r11'),
models.DDD(name='r22')
]
models.DDD.objects.bulk_create(objs, 10)
33那婉、django中Form和ModelForm的作用
- 作用:
- 對(duì)用戶請(qǐng)求數(shù)據(jù)格式進(jìn)行校驗(yàn)
- 自動(dòng)生成HTML標(biāo)簽- 區(qū)別:
- Form,字段需要自己手寫(xiě)党瓮。
class Form(Form):
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.) - ModelForm详炬,可以通過(guò)Meta進(jìn)行定義
class MForm(ModelForm):
class Meta:
fields = "all"
model = UserInfo
- Form,字段需要自己手寫(xiě)党瓮。
- 應(yīng)用:只要是客戶端向服務(wù)端發(fā)送表單數(shù)據(jù)時(shí),都可以進(jìn)行使用寞奸,如:用戶登錄注冊(cè)
- 區(qū)別:
34呛谜、django的Form組件中,如果字段包含choices參數(shù)枪萄,請(qǐng)使用兩種方式實(shí)現(xiàn)數(shù)據(jù)源實(shí)
方式一:重寫(xiě)構(gòu)造方法隐岛,在構(gòu)造方法中重新去數(shù)據(jù)庫(kù)獲取值
class UserForm(Form):
name = fields.CharField(label='用戶名',max_length=32)
email = fields.EmailField(label='郵箱')
ut_id = fields.ChoiceField(
# choices=[(1,'二B用戶'),(2,'山炮用戶')]
choices=[]
)
def __init__(self,*args,**kwargs):
super(UserForm,self).__init__(*args,**kwargs)
self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title')
方式二: ModelChoiceField字段
from django.forms import Form
from django.forms import fields
from django.forms.models import ModelChoiceField
class UserForm(Form):
name = fields.CharField(label='用戶名',max_length=32)
email = fields.EmailField(label='郵箱')
ut_id = ModelChoiceField(queryset=models.UserType.objects.all())
依賴:
class UserType(models.Model):
title = models.CharField(max_length=32)
def __str__(self):
return self.title
35、django的Model中的ForeignKey字段中的on_delete參數(shù)的作用
on_delete有CASCADE瓷翻、PROTECT聚凹、SET_NULL、SET_DEFAULT齐帚、SET()五個(gè)可選擇的值
CASCADE:此值設(shè)置妒牙,是級(jí)聯(lián)刪除。
PROTECT:此值設(shè)置对妄,是會(huì)報(bào)完整性錯(cuò)誤湘今。
SET_NULL:此值設(shè)置,會(huì)把外鍵設(shè)置為null剪菱,前提是允許為null摩瞎。
SET_DEFAULT:此值設(shè)置,會(huì)把設(shè)置為外鍵的默認(rèn)值琅豆。
SET():此值設(shè)置愉豺,會(huì)調(diào)用外面的值,可以是一個(gè)函數(shù)茫因。
36蚪拦、django中csrf的實(shí)現(xiàn)機(jī)制
Django預(yù)防CSRF攻擊的方法是在用戶提交的表單中加入一個(gè)csrftoken的隱含值,這個(gè)值和服務(wù)器中保存的csrftoken的值相同冻押,這樣做的原理如下:
1驰贷、在用戶訪問(wèn)django的可信站點(diǎn)時(shí),django反饋給用戶的表單中有一個(gè)隱含字段csrftoken洛巢,這個(gè)值是在服務(wù)器端隨機(jī)生成的括袒,每一次提交表單都會(huì)生成不同的值
2、當(dāng)用戶提交django的表單時(shí)稿茉,服務(wù)器校驗(yàn)這個(gè)表單的csrftoken是否和自己保存的一致锹锰,來(lái)判斷用戶的合法性
3芥炭、當(dāng)用戶被csrf攻擊從其他站點(diǎn)發(fā)送精心編制的攻擊請(qǐng)求時(shí),由于其他站點(diǎn)不可能知道隱藏的csrftoken字段的信息這樣在服務(wù)器端就會(huì)校驗(yàn)失敗恃慧,攻擊被成功防御
具體配置如下:
template中添加{%csrf_token%}標(biāo)簽
https://blog.csdn.net/u012556900/article/details/57412707
37园蝠、django中如何實(shí)現(xiàn)websocket
https://www.cnblogs.com/huguodong/p/6611602.html
38、基于django使用ajax發(fā)送post請(qǐng)求時(shí)痢士,都可以使用哪種方法攜帶csrf_token
三種方式:https://www.cnblogs.com/wxp5257/p/7834090.html
39彪薛、django如何實(shí)現(xiàn)orm表中添加數(shù)據(jù)時(shí)創(chuàng)建一條日志記錄
LOGGING配置查看翻譯的SQL:
在Django的日志設(shè)置中,配置上一個(gè)名為django.db.backends的logger實(shí)例即可查看翻譯后的SQL語(yǔ)句怠蹂。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
http://www.cnblogs.com/owasp/p/5981355.html
40善延、如何設(shè)置django緩存
三種粒度緩存
1 中間件級(jí)別
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
CACHE_MIDDLEWARE_SECONDS=10
2 視圖級(jí)別
from django.views.decorators.cache import cache_page
@cache_page(15)
def index(request):
import time
t=time.time()
return render(request,"index.html",locals())
3 局部緩存
{% load cache %}
...
...
{% cache 15 "time_cache" %}
<h3>緩存時(shí)間:{{ t }}</h3>
{% endcache %}
41、django中的緩存能使用redis嗎城侧,能的話如何配置
pip install django-redis
apt-get install redis-server
然后在settings.py 里面添加CACHES = {
'default': {
'BACKEND': 'redis_cache.cache.RedisCache',
'LOCATION': '127.0.0.1:6379',
"OPTIONS": {
"CLIENT_CLASS": "redis_cache.client.DefaultClient",
},
}
42易遣、django中路由系統(tǒng)的name的作用
簡(jiǎn)單說(shuō),name 可以用于在 templates, models, views ……中得到對(duì)應(yīng)的網(wǎng)址赞庶,相當(dāng)于“給網(wǎng)址取了個(gè)名字”训挡,只要這個(gè)名字不變,網(wǎng)址變了也能通過(guò)名字獲取到歧强。
https://blog.csdn.net/liweiblog/article/details/77599604
43、django模板中filter和simple_tag的區(qū)別
simple_tag
-參數(shù)任意为肮,但是不能作為if條件判斷的條件
filter
-參數(shù)最多只能有兩個(gè)摊册,但是可以作為if條件判斷的條件。
http://www.cnblogs.com/cerofang/p/8367588.html
44颊艳、djang-debug-toolbar的作用
django_debug_toolbar 是django的第三方工具包茅特,給django擴(kuò)展了調(diào)試功能。
包括查看執(zhí)行的sql語(yǔ)句棋枕,db查詢次數(shù)白修,request,headers重斑,調(diào)試概覽等兵睛。
https://blog.csdn.net/weixin_39198406/article/details/78821677
45、django如何實(shí)現(xiàn)單元測(cè)試
http://www.reibang.com/p/34267dd79ad6
46窥浪、簡(jiǎn)述orm中的db first和code first的含義
datebase first就是代表數(shù)據(jù)庫(kù)優(yōu)先祖很,那么前提就是先創(chuàng)建數(shù)據(jù)庫(kù)。
model first就是代表model優(yōu)先漾脂,那么前提也就是先創(chuàng)建model假颇,然后根據(jù)model自動(dòng)建立數(shù)據(jù)庫(kù)。
47骨稿、django中如何根據(jù)數(shù)據(jù)庫(kù)表生成model中的類(lèi)
https://jingyan.baidu.com/article/4ae03de3e513d23eff9e6bb7.html
48笨鸡、使用orm和原生sql的優(yōu)缺點(diǎn)
ORM框架:對(duì)象關(guān)系映射姜钳,通過(guò)創(chuàng)建一個(gè)類(lèi),這個(gè)類(lèi)與數(shù)據(jù)庫(kù)的表相對(duì)應(yīng)形耗!類(lèi)的對(duì)象代指數(shù)據(jù)庫(kù)中的一行數(shù)據(jù)傲须。
簡(jiǎn)述ORM原理:讓用戶不再寫(xiě)SQL語(yǔ)句,而是通過(guò)類(lèi)以及對(duì)象的方式趟脂,和其內(nèi)部提供的方法泰讽,進(jìn)行數(shù)據(jù)庫(kù)操作!把用戶輸入的類(lèi)或?qū)ο筠D(zhuǎn)換成SQL語(yǔ)句昔期,轉(zhuǎn)換之后通過(guò)pymysql執(zhí)行完成數(shù)據(jù)庫(kù)的操作已卸。
ORM的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
提高開(kāi)發(fā)效率,降低開(kāi)發(fā)成本
使開(kāi)發(fā)更加對(duì)象化
可移植
可以很方便地引入數(shù)據(jù)緩存之類(lèi)的附加功能
缺點(diǎn):
在處理多表聯(lián)查硼一、where條件復(fù)雜之類(lèi)的查詢時(shí)累澡,ORM的語(yǔ)法會(huì)變得復(fù)雜。就需要寫(xiě)入原生SQL般贼。
49愧哟、簡(jiǎn)述MVC和MTV
MTV和MVC?
MVC: model view controller
MTV: model tempalte view
50哼蛆、django中contenttype組件的作用
contenttype是django的一個(gè)組件(app)蕊梧,為我們找到django程序中所有app中的所有表并添加到記錄中。
可以使用他再加上表中的兩個(gè)字段實(shí)現(xiàn):一張表和N張表創(chuàng)建FK關(guān)系腮介。
- 字段:表名稱(chēng)
- 字段:數(shù)據(jù)行ID
應(yīng)用:路飛表結(jié)構(gòu)優(yōu)惠券和專(zhuān)題課和學(xué)位課關(guān)聯(lián)肥矢。
http://www.cnblogs.com/iyouyue/p/8810464.html
51、談?wù)剬?duì)restful規(guī)范的認(rèn)識(shí)
- restful其實(shí)就是一套編寫(xiě)接口的協(xié)議叠洗,協(xié)議規(guī)定如何編寫(xiě)以及如何設(shè)置返回值甘改、狀態(tài)碼等信息。
- 最顯著的特點(diǎn):
restful: 給用戶一個(gè)url灭抑,根據(jù)method不同在后端做不同的處理十艾,比如:post 創(chuàng)建數(shù)據(jù)、get獲取數(shù)據(jù)腾节、put和patch修改數(shù)據(jù)忘嫉、delete刪除數(shù)據(jù)。
no rest: 給調(diào)用者很多url禀倔,每個(gè)url代表一個(gè)功能榄融,比如:add_user/delte_user/edit_user/ - 當(dāng)然,還有協(xié)議其他的救湖,比如:
- 版本愧杯,來(lái)控制讓程序有多個(gè)版本共存的情況,版本可以放在 url鞋既、請(qǐng)求頭(accept/自定義)力九、GET參數(shù)
- 狀態(tài)碼耍铜,200/300/400/500
- url中盡量使用名詞,restful也可以稱(chēng)為“面向資源編程”
- api標(biāo)示:
api.YueNet.com
www.YueNet.com/api/
- 最顯著的特點(diǎn):
- https
- 域名
- api.oldboy.com
- www.oldboy.com/api
- 版本:
- www.oldboy.com/api/v1
- URL資源跌前,名詞
- www.oldboy.com/api/v1/student
- 請(qǐng)求方式:
- GET/POST/PUT/DELETE/PATCH/OPTIONS/HEADERS/TRACE
- 返回值:
- www.oldboy.com/api/v1/student/ -> 結(jié)果集
- www.oldboy.com/api/v1/student/1/ -> 單個(gè)對(duì)象
- URL添加條件
- www.oldboy.com/api/v1/student棕兼?page=11&size=9
- 狀態(tài)碼:
- 200
- 300
- 301
- 302
- 400
- 403
- 404
- 500
- 錯(cuò)誤信息
{
code:1000,
meg:'xxxx'
}
- hyperlink
{
id:1
name: ‘xiangl’,
type: http://www.xxx.com/api/v1/type/1/
}
52、接口冪等性是什么
一個(gè)接口通過(guò)首先進(jìn)行1次訪問(wèn)抵乓,然后對(duì)該接口進(jìn)行N次相同訪問(wèn)的時(shí)候伴挚,對(duì)訪問(wèn)對(duì)象不造成影響,那么就認(rèn)為接口具有冪等性灾炭。
比如:
GET茎芋, 第一次獲取數(shù)據(jù)、第二次也是獲取結(jié)果蜈出,冪等田弥。
POST, 第一次新增數(shù)據(jù)铡原,第二次也會(huì)再次新增偷厦,非冪等。
PUT燕刻, 第一次更新數(shù)據(jù)只泼,第二次不會(huì)再次更新,冪等酌儒。
PATCH辜妓,第一次更新數(shù)據(jù),第二次可能再次更新忌怎,非冪等。
DELTE酪夷,第一次刪除數(shù)據(jù)榴啸,第二次不會(huì)再次刪除,冪等晚岭。
53鸥印、什么是RPCRPC(Remote Procedure Call)—遠(yuǎn)程過(guò)程調(diào)用,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù)坦报,而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議库说。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP片择,為通信程序之間攜帶信息數(shù)據(jù)潜的。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層字管。RPC使得開(kāi)發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易啰挪。
54信不、http和https的區(qū)別
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息,HTTP協(xié)議以明文方式發(fā)送內(nèi)容亡呵,不提供任何方式的數(shù)據(jù)加密抽活,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息锰什,因此下硕,HTTP協(xié)議不適合傳輸一些敏感信息,比如:信用卡號(hào)汁胆、密碼等支付信息梭姓。
為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS沦泌,為了數(shù)據(jù)傳輸?shù)陌踩迹琀TTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書(shū)來(lái)驗(yàn)證服務(wù)器的身份谢谦,并為瀏覽器和服務(wù)器之間的通信加密释牺。
https://www.cnblogs.com/wqhwe/p/5407468.html
55、為什么要使用django rest framework框架
1.客戶端-服務(wù)端分離
優(yōu)點(diǎn):提高用戶界面的便攜性回挽,通過(guò)簡(jiǎn)化服務(wù)器提高可伸縮性....
2.無(wú)狀態(tài)(Stateless):從客戶端的每個(gè)請(qǐng)求要包含服務(wù)器所需要的所有信息
優(yōu)點(diǎn):提高可見(jiàn)性(可以單獨(dú)考慮每個(gè)請(qǐng)求)没咙,提高了可靠性(更容易從局部故障中修復(fù)),提高可擴(kuò)展性(降低了服務(wù)器資源使用)
3.緩存(Cachable):服務(wù)器返回信息必須被標(biāo)記是否可以緩存千劈,如果緩存祭刚,客戶端可能會(huì)重用之前的信息發(fā)送請(qǐng)求
優(yōu)點(diǎn):減少交互次數(shù),減少交互的平均延遲
4.統(tǒng)一接口
優(yōu)點(diǎn):提高交互的可見(jiàn)性墙牌,鼓勵(lì)單獨(dú)改善組件
5.支持按需代碼(Code-On-Demand 可選)
優(yōu)點(diǎn):提高可擴(kuò)展性
https://www.cnblogs.com/vipchenwei/p/7867028.html
56涡驮、django rest framework框架中有哪些組件
-
路由,自動(dòng)幫助開(kāi)發(fā)者快速為一個(gè)視圖創(chuàng)建4個(gè)url
www.oldboyedu.com/api/v1/student/www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$ www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
-
版本處理
- 問(wèn)題:版本都可以放在那里喜滨?
- url
- GET
- 請(qǐng)求頭
- 問(wèn)題:版本都可以放在那里喜滨?
-
認(rèn)證
- 問(wèn)題:認(rèn)證流程捉捅?
-
權(quán)限
- 權(quán)限是否可以放在中間件中?以及為什么虽风?
-
訪問(wèn)頻率的控制
匿名用戶可以真正的防止棒口?無(wú)法做到真正的訪問(wèn)頻率控制,只能把小白拒之門(mén)外辜膝。
如果要封IP无牵,使用防火墻來(lái)做。登錄用戶可以通過(guò)用戶名作為唯一標(biāo)示進(jìn)行控制厂抖,如果有人注冊(cè)很多賬號(hào)茎毁,也無(wú)法防止。
視圖
解析器 验游,根據(jù)Content-Type請(qǐng)求頭對(duì)請(qǐng)求體中的數(shù)據(jù)格式進(jìn)行處理充岛。request.data
分頁(yè)
-
序列化
- 序列化
- source
- 定義方法
- 請(qǐng)求數(shù)據(jù)格式校驗(yàn)
- 序列化
渲染器
-
57保檐、django rest framework框架中的視圖都可以繼承那些類(lèi)
a. 繼承 APIView
這個(gè)類(lèi)屬于rest framework中頂層類(lèi),內(nèi)部幫助我們實(shí)現(xiàn)了只是基本功能:認(rèn)證崔梗、權(quán)限夜只、頻率控制,但凡是數(shù)據(jù)庫(kù)蒜魄、分頁(yè)等操作都需要手動(dòng)去完成扔亥,比較原始。
class GenericAPIView(APIView)
def post(...):
pass
b. 繼承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
如果繼承它之后谈为,路由中的as_view需要填寫(xiě)對(duì)應(yīng)關(guān)系 .as_view({'get':'list','post':'create'})
在內(nèi)部也幫助我們提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer
注意:要設(shè)置queryset字段旅挤,否則會(huì)跑出斷言的異常。
# 只提供增加功能
class TestView(GenericViewSet):
serializer_class = XXXXXXX
def create(self,*args,**kwargs):
pass # 獲取數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行操作
c. 繼承
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
對(duì)數(shù)據(jù)庫(kù)和分頁(yè)等操作不用我們?cè)诰帉?xiě)伞鲫,只需要繼承相關(guān)類(lèi)即可粘茄。
示例:只提供增加功能
class TestView(mixins.CreateModelMixin,GenericViewSet):
serializer_class = XXXXXXX
http://www.cnblogs.com/iyouyue/p/8798572.html#_label3
58湿右、簡(jiǎn)述django rest framework框架的認(rèn)證流程
- 如何編寫(xiě)态坦?寫(xiě)類(lèi)并實(shí)現(xiàn)authticate
- 方法中可以定義三種返回值:
- (user,auth)襟士,認(rèn)證成功
- None , 匿名用戶
- 異常 磕秤,認(rèn)證失敗
- 流程:
- dispatch
- 再去request中進(jìn)行認(rèn)證處理
https://www.cnblogs.com/haiyan123/p/8419872.html
- 方法中可以定義三種返回值:
59、django rest framework如何實(shí)現(xiàn)用戶訪問(wèn)頻率限制
a. 基于用戶IP限制訪問(wèn)頻率
b. 基于用戶IP顯示訪問(wèn)頻率(利于Django緩存)
c. view中限制請(qǐng)求頻率
d. 匿名時(shí)用IP限制+登錄時(shí)用Token限制
e. 全局使用
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'api.utils.throttles.throttles.LuffyAnonRateThrottle',
'api.utils.throttles.throttles.LuffyUserRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '10/day',
'user': '10/day',
'luffy_anon': '10/m',
'luffy_user': '20/m',
},
}
https://www.cnblogs.com/vipchenwei/p/7867028.html
60怀薛、Flask框架的優(yōu)勢(shì)
一些己、整體設(shè)計(jì)方面
首先锄禽,兩者都是非常優(yōu)秀的框架傍药。整體來(lái)講磺平,兩者設(shè)計(jì)的哲學(xué)是區(qū)別最大的地方。Django提供一站式的解決方案拐辽,從模板拣挪、ORM、Session俱诸、Authentication等等都分配好了媒吗,連app劃分都做好了,總之乙埃,為你做盡量多的事情,而且還有一個(gè)killer級(jí)的特性锯岖,就是它的admin介袜,配合django-suit,后臺(tái)就出來(lái)了出吹,其實(shí)最初Django就是由在新聞發(fā)布公司工作的人設(shè)計(jì)的遇伞。Flask只提供了一些核心功能,非常簡(jiǎn)潔優(yōu)雅捶牢。它是一個(gè)微框架鸠珠,其他的由擴(kuò)展提供巍耗,但它的blueprint使它也能夠很方便的進(jìn)行水平擴(kuò)展。
二渐排、路由設(shè)計(jì)
Django的路由設(shè)計(jì)是采用集中處理的方法炬太,利用正則匹配。Flask也能這么做驯耻,但更多的是使用裝飾器的形式亲族,這個(gè)有優(yōu)點(diǎn)也有缺點(diǎn),優(yōu)點(diǎn)是讀源碼時(shí)看到函數(shù)就知道怎么用的可缚,缺點(diǎn)是一旦源碼比較長(zhǎng)霎迫,你要查路由就不太方便了,但這也促使你去思考如何更合理的安排代碼帘靡。
三知给、應(yīng)用模塊化設(shè)計(jì)
Django的模塊化是集成在命令里的,也就是說(shuō)一開(kāi)始Django的目標(biāo)就是為以后玩大了做準(zhǔn)備的描姚。每個(gè)都是一個(gè)獨(dú)立的模塊涩赢,為以后的復(fù)用提供了便利。Flask通過(guò)Blueprint來(lái)提供模塊化轰胁,自己對(duì)項(xiàng)目結(jié)構(gòu)劃分成不同的模塊進(jìn)行組織谒主。
四、配置
Django的配置主要還是靠settings.py來(lái)做赃阀,當(dāng)然為了Development和Production環(huán)境分離霎肯,還有一些方法來(lái)處理配置。Flask的配置很靈活榛斯,有多種方法配置观游,不同環(huán)境的配置也非常方便。
五驮俗、文檔
兩者都提供了詳盡的文檔懂缕,F(xiàn)lask的文檔風(fēng)格很受我個(gè)人喜好,Django的文檔也非常優(yōu)秀王凑,當(dāng)時(shí)用學(xué)Django時(shí)搪柑,就是只看了Django的文檔。
六索烹、社區(qū)
Django社區(qū)很大工碾,各種插件很齊全,大部分情況下你都能找到你想要的百姓。Flask起步晚渊额,但社區(qū)也不小,之前有一次看在github上的star數(shù),兩個(gè)相差并不遠(yuǎn)旬迹,說(shuō)明越來(lái)越多的人關(guān)注它火惊,雖然插件沒(méi)那么全,但常用的還都是有的奔垦,而且質(zhì)量都比較高屹耐。
61、Flask框架依賴組件
Flask依賴兩個(gè)外部庫(kù):
Jinja2模板引擎
Werkzeng WSGI工具集宴倍。
62张症、Flask中的藍(lán)圖有什么用途
將不同的功能 模塊化;
構(gòu)建大型的應(yīng)用鸵贬;
優(yōu)化項(xiàng)目結(jié)構(gòu)俗他;
增強(qiáng)可讀性,易于維護(hù)阔逼;
63兆衅、列舉使用過(guò)的Flask第三方組件
內(nèi)置:
- 配置
- 路由
- 視圖
- 模板
- session
- 閃現(xiàn)
- 藍(lán)圖
- 中間件
- 特殊裝飾器
第三方:
- Flask組件:
- flask-session
- flask-SQLAlchemy
- flask-migrate
- flask-script
- blinker
- 公共組件:
- wtforms
- dbutile
- sqlalchemy
- 自定義Flask組件
- auth ,參考flask-login組件
64嗜浮、簡(jiǎn)述Flask上下文管理流程
每次有請(qǐng)求過(guò)來(lái)的時(shí)候羡亩,flask 會(huì)先創(chuàng)建當(dāng)前線程或者進(jìn)程需要處理的兩個(gè)重要上下文對(duì)象,把它們保存到隔離的棧里面危融,這樣視圖函數(shù)進(jìn)行處理的時(shí)候就能直接從棧上獲取這些信息畏铆。
參考鏈接:http://python.jobbole.com/87398/
65、Flask中的g的作用
g 相當(dāng)于一次請(qǐng)求的全局變量吉殃,當(dāng)請(qǐng)求進(jìn)來(lái)時(shí)將g和current_app封裝為一個(gè)APPContext類(lèi)辞居,在通過(guò)LocalStack將Appcontext放入Local中,取值時(shí)通過(guò)偏函數(shù)蛋勺,LocalStack瓦灶、loca l中取值,響應(yīng)時(shí)將local中的g數(shù)據(jù)刪除
66抱完、Flask中上下文管理涉及到哪些相關(guān)的類(lèi)贼陶,并描述其主要作用
flask
requestcontext
request
securecookiesessioninterface
securecookiesession
67、為什么要Flask把Local對(duì)象中的值stack維護(hù)成一個(gè)列表
當(dāng)是web應(yīng)用時(shí):不管是單線程還是多線程巧娱,棧中只有一個(gè)數(shù)據(jù)
- 服務(wù)端單線程:
{
111:{stack: [ctx, ]}
}
- 服務(wù)端多線程:
{
111:{stack: [ctx, ]}
112:{stack: [ctx, ]}
}
68碉怔、Flask中多app應(yīng)用是怎么完成的
目的是想要將local中的值維護(hù)成一個(gè)棧,例如:在多app應(yīng)用中編寫(xiě)離線腳本時(shí)禁添,可以實(shí)用上眨层。
from m_app import app01,app02
from flask import current_app
"""
{
1231: {
stack: [app01,app02,]
}
}
"""
with app01.app_context():
print(current_app)
with app02.app_context():
print(current_app)
print(current_app)
69、在Flask中實(shí)現(xiàn)websocket需要什么組件
Flask-SocketIO
Flask-Sockets是Flask框架的一個(gè)擴(kuò)展上荡,通過(guò)它,F(xiàn)lask應(yīng)用程序可以使用WebSocket。
https://blog.csdn.net/u013793383/article/details/72848252
https://github.com/miguelgrinberg/Flask-SocketIO
70酪捡、wtforms組件的作用
WTForms是一個(gè)支持多個(gè)web框架的form組件叁征,主要用于對(duì)用戶請(qǐng)求數(shù)據(jù)進(jìn)行驗(yàn)證。
https://www.cnblogs.com/big-handsome-guy/p/8552079.html
https://www.cnblogs.com/liuwei0824/p/8330985.html
71逛薇、Flask框架默認(rèn)session處理機(jī)制
Flask的默認(rèn)session利用了Werkzeug的SecureCookie捺疼,把信息做序列化(pickle)后編碼(base64),放到cookie里了永罚。
過(guò)期時(shí)間是通過(guò)cookie的過(guò)期時(shí)間實(shí)現(xiàn)的啤呼。
為了防止cookie內(nèi)容被篡改,session會(huì)自動(dòng)打上一個(gè)叫session的hash串呢袱,這個(gè)串是經(jīng)過(guò)session內(nèi)容官扣、SECRET_KEY計(jì)算出來(lái)的,看得出羞福,這種設(shè)計(jì)雖然不能保證session里的內(nèi)容不泄露惕蹄,但至少防止了不被篡改。
https://blog.csdn.net/qq_33733970/article/details/79008831
72治专、解釋Flask中Local對(duì)象和threading.local對(duì)象的區(qū)別
a. threading.local
作用:為每個(gè)線程開(kāi)辟一塊空間進(jìn)行數(shù)據(jù)存儲(chǔ)卖陵。
問(wèn)題:自己通過(guò)字典創(chuàng)建一個(gè)類(lèi)似于threading.local的東西。
storage={
4740:{val:0},
4732:{val:1},
4731:{val:3},
...
}
b. 自定義Local對(duì)象
作用:為每個(gè)線程(協(xié)程)開(kāi)辟一塊空間進(jìn)行數(shù)據(jù)存儲(chǔ)张峰。
try:
from greenlet import getcurrent as get_ident
except Exception as e:
from threading import get_ident
from threading import Thread
import time
class Local(object):
def __init__(self):
object.__setattr__(self,'storage',{})
def __setattr__(self, k, v):
ident = get_ident()
if ident in self.storage:
self.storage[ident][k] = v
else:
self.storage[ident] = {k: v}
def __getattr__(self, k):
ident = get_ident()
return self.storage[ident][k]
obj = Local()
def task(arg):
obj.val = arg
obj.xxx = arg
print(obj.val)
for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
73泪蔫、Flask中blinker是什么
Flask框架中的信號(hào)基于blinker,可以讓開(kāi)發(fā)者在flask請(qǐng)求過(guò)程中 定制一些用戶行為執(zhí)行喘批。
在請(qǐng)求前后撩荣,模板渲染前后,上下文前后谤祖,異常 的時(shí)候
http://www.cnblogs.com/big-handsome-guy/p/8551973.html
74婿滓、SQLAlchemy中的session和scoped_session的區(qū)別
使用scoped_session的目的主要是為了線程安全。
scoped_session類(lèi)似單例模式粥喜,當(dāng)我們調(diào)用使用的時(shí)候凸主,會(huì)先在Registry里找找之前是否已經(jīng)創(chuàng)建session了。
要是有额湘,就把這個(gè)session返回卿吐。
要是沒(méi)有,就創(chuàng)建新的session锋华,注冊(cè)到Registry中以便下次返回給調(diào)用者嗡官。
這樣就實(shí)現(xiàn)了這樣一個(gè)目的:在同一個(gè)線程中,call scoped_session 的時(shí)候毯焕,返回的是同一個(gè)對(duì)象
https://www.cnblogs.com/geeklove01/p/8179220.html
https://www.cnblogs.com/lianxuebin/p/8664401.html
75衍腥、SQLAlchemy如何執(zhí)行原生sql
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql://root:*****@127.0.0.1/database?charset=utf8')
DB_Session = sessionmaker(bind=engine)
session = DB_Session()
session.execute('alter table mytablename drop column mycolumn ;')
https://www.cnblogs.com/franknihao/p/7268752.html
76、ORM的實(shí)現(xiàn)原理
概念: 對(duì)象關(guān)系映射(Object Relational Mapping婆咸,簡(jiǎn)稱(chēng)ORM竹捉,或O/RM,或O/R mapping)尚骄,是一種程序技術(shù)块差,用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類(lèi)型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。
詳細(xì)介紹: 讓我們從O/R開(kāi)始倔丈。字母O起源于"對(duì)象"(Object),而R則來(lái)自于"關(guān)系"(Relational)憨闰。幾乎所有的程序里面,都存在對(duì)象和關(guān)系數(shù)據(jù)庫(kù)需五。在業(yè)務(wù)邏輯層和用戶界面層中鹉动,我們是面向?qū)ο蟮摹.?dāng)對(duì)象信息發(fā)生變化的時(shí)候警儒,我們需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中训裆。
當(dāng)你開(kāi)發(fā)一個(gè)應(yīng)用程序的時(shí)候(不使用O/R Mapping),你可能會(huì)寫(xiě)不少數(shù)據(jù)訪問(wèn)層的代碼,用來(lái)從數(shù)據(jù)庫(kù)保存蜀铲,刪除边琉,讀取對(duì)象信息,等等记劝。你在DAL中寫(xiě)了很多的方法來(lái)讀取對(duì)象數(shù)據(jù)变姨,改變狀態(tài)對(duì)象等等任務(wù)。而這些代碼寫(xiě)起來(lái)總是重復(fù)的厌丑。
ORM解決的主要問(wèn)題是對(duì)象關(guān)系的映射定欧。域模型和關(guān)系模型分別是建立在概念模型的基礎(chǔ)上的。域模型是面向?qū)ο蟮呐停P(guān)系模型是面向關(guān)系的砍鸠。一般情況下,一個(gè)持久化類(lèi)和一個(gè)表對(duì)應(yīng)耕驰,類(lèi)的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄爷辱,類(lèi)的每個(gè)屬性對(duì)應(yīng)表的每個(gè)字段。
ORM技術(shù)特點(diǎn):
1.提高了開(kāi)發(fā)效率朦肘。由于ORM可以自動(dòng)對(duì)Entity對(duì)象與數(shù)據(jù)庫(kù)中的Table進(jìn)行字段與屬性的映射饭弓,所以我們實(shí)際可能已經(jīng)不需要一個(gè)專(zhuān)用的、龐大的數(shù)據(jù)訪問(wèn)層媒抠。
2.ORM提供了對(duì)數(shù)據(jù)庫(kù)的映射弟断,不用sql直接編碼,能夠像操作對(duì)象一樣從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)趴生。
77阀趴、DBUtils模塊的作用
使用DBUtils模塊
兩種使用模式:
1 為每個(gè)線程創(chuàng)建一個(gè)連接昏翰,連接不可控,需要控制線程數(shù)
2 創(chuàng)建指定數(shù)量的連接在連接池舍咖,當(dāng)線程訪問(wèn)的時(shí)候去取矩父,如果不夠了線程排隊(duì),直到有人釋放排霉。平時(shí)建議使用這種!
https://www.cnblogs.com/ArmoredTitan/p/Flask.html
78民轴、一下SQLAlchemy的字段是否正確攻柠,如果不正確請(qǐng)改正
from datetime import datetime
from sqlalchemy.ext.declarative
import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
Base = declarative_base()
class UserInfo(Base):
tablename = 'userinfo'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(64), unique=True)
ctime = Column(DateTime, default=datetime.now())
ctime字段中的參數(shù)應(yīng)該為default=datetime.now, now后面不應(yīng)該加括號(hào).如果加了,字段不會(huì)隨時(shí)更新
79、SQLAlchemy中如何為表設(shè)置引擎和字符編碼
sqlalchemy設(shè)置編碼字符集一定要在數(shù)據(jù)庫(kù)訪問(wèn)的URL上增加charset=utf8后裸,否則數(shù)據(jù)庫(kù)的連接就不是utf8的編碼格式
eng = create_engine('mysql://root:root@localhost:3306/test2?charset=utf8',echo=True)
80瑰钮、SQLAlchemy如何設(shè)置聯(lián)合唯一索引
UniqueConstraint 設(shè)置聯(lián)合唯一索引
https://www.cnblogs.com/jasonwang-2016/p/5980237.html
81、簡(jiǎn)述Tornado框架的特點(diǎn)
Tornado的獨(dú)特之處在于其所有開(kāi)發(fā)工具能夠使用在應(yīng)用開(kāi)發(fā)的任意階段以及任何檔次的硬件資源上微驶。而且浪谴,完整集的Tornado工具可以使開(kāi)發(fā)人員完全不用考慮與目標(biāo)連接的策略或目標(biāo)存儲(chǔ)區(qū)大小。Tornado 結(jié)構(gòu)的專(zhuān)門(mén)設(shè)計(jì)為開(kāi)發(fā)人員和第三方工具廠商提供了一個(gè)開(kāi)放環(huán)境因苹。已有部分應(yīng)用程序接口可以利用并附帶參考書(shū)目苟耻,內(nèi)容從開(kāi)發(fā)環(huán)境接口到連接實(shí)現(xiàn)。Tornado包括強(qiáng)大的開(kāi)發(fā)和調(diào)試工具扶檐,尤其適用于面對(duì)大量問(wèn)題的嵌入式開(kāi)發(fā)人員凶杖。這些工具包括C和C++源碼級(jí)別的調(diào)試器,目標(biāo)和工具管理款筑,系統(tǒng)目標(biāo)跟蹤智蝠,內(nèi)存使用分析和自動(dòng)配置. 另外,所有工具能很方便地同時(shí)運(yùn)行奈梳,很容易增加和交互式開(kāi)發(fā)杈湾。
82、簡(jiǎn)述Tornado框架中Futrue對(duì)象的作用
http://python.jobbole.com/87310/
83攘须、Tornado如何編寫(xiě)websocket程序
https://www.cnblogs.com/aguncn/p/5665916.html
84漆撞、Tornado中靜態(tài)文件是如何處理的
如: <link href="{{static_url("commons.css")}}" rel="stylesheet" />
處理方法:
static_path = os.path.join(os.paht.dirname(file), "static") #這里增加設(shè)置了靜態(tài)路徑
另外一個(gè)修改就是在實(shí)例化 tornado.web.Application() 的時(shí)候,在參數(shù)中阻课,出了有靜態(tài)路徑參數(shù) static_path 叫挟,還有一個(gè)參數(shù)設(shè)置 debug=True
https://blog.csdn.net/hqzxsc2006/article/details/72833012
85、Tornado操作MySQL使用的模塊
torndb是一個(gè)輕量級(jí)的基于MySQLdb封裝的一個(gè)模塊限煞,從tornado3.0版本以后抹恳,其已經(jīng)作為一個(gè)獨(dú)立模塊發(fā)行了。torndb依賴于MySQLdb模塊署驻,因此奋献,在使用torndb模塊時(shí)健霹,要保證系統(tǒng)中已經(jīng)有MySQLdb模塊。
86瓶蚂、Tornado操作Redis使用的模塊
tornado-redis
https://blog.csdn.net/guoqianqian5812/article/details/68587921
87糖埋、簡(jiǎn)述Tornado框架適用的場(chǎng)景Tornado是使用Python編寫(xiě)的一個(gè)強(qiáng)大的、可擴(kuò)展的Web服務(wù)器窃这。它在處理嚴(yán)峻的網(wǎng)絡(luò)流量時(shí)表現(xiàn)得足夠強(qiáng)健瞳别,但卻在創(chuàng)建和編寫(xiě)時(shí)有著足夠的輕量級(jí),并能夠被用在大量的應(yīng)用和工具中杭攻。
我們現(xiàn)在所知道的Tornado是基于Bret Taylor和其他人員為FriendFeed所開(kāi)發(fā)的網(wǎng)絡(luò)服務(wù)框架祟敛,當(dāng)FriendFeed被Facebook收購(gòu)后得以開(kāi)源。不同于那些最多只能達(dá)到10,000個(gè)并發(fā)連接的傳統(tǒng)網(wǎng)絡(luò)服務(wù)器兆解,Tornado在設(shè)計(jì)之初就考慮到了性能因素馆铁,旨在解決C10K問(wèn)題,這樣的設(shè)計(jì)使得其成為一個(gè)擁有非常高性能的框架锅睛。此外埠巨,它還擁有處理安全性、用戶驗(yàn)證现拒、社交網(wǎng)絡(luò)以及與外部服務(wù)(如數(shù)據(jù)庫(kù)和網(wǎng)站API)進(jìn)行異步交互的工具辣垒。
https://www.cnblogs.com/luotianshuai/p/5482612.html
88、git常見(jiàn)命令作用
某個(gè)文件夾中的內(nèi)容進(jìn)行版本管理:
進(jìn)入文件夾具练,右鍵git bash
git init 初始化乍构,當(dāng)前所在的文件夾可以被管理且以后版本相關(guān)的數(shù)據(jù)都會(huì)存儲(chǔ)到.git文件中
git status 查看當(dāng)前文件夾以及子目錄中文件是否發(fā)生變化:內(nèi)容修改/新增文件/刪除,已經(jīng)變化的文件會(huì)變成紅色扛点,已經(jīng)add的文件會(huì)變成綠色
git add . 給發(fā)生變化的文件(貼上一個(gè)標(biāo)簽)或 將發(fā)生變化的文件放到某個(gè)地方哥遮,只寫(xiě)一個(gè)句點(diǎn)符就代表把git status中紅色的文件全部打上標(biāo)簽
git commit -m '新增用戶登錄認(rèn)證功能以及xxx功能' 將“綠色”文件添加到版本中
git log 查看所有版本提交記錄,可以獲取版本號(hào)
git reset --hard 版本號(hào) 將最新的版本回退到更早的版本
git reflog 回退到之前版本后悔了陵究,再更新到最新或者最新之前的版本
git reset --hard 版本 回退
89眠饮、簡(jiǎn)述一下git中stash命令作用以及其他相關(guān)命令
stash用于將工作區(qū)發(fā)生變化的所有文件獲取臨時(shí)存儲(chǔ)在“某個(gè)地方”,將工作區(qū)還原當(dāng)前版本未操作前的狀態(tài)铜邮;stash還可以將臨時(shí)存儲(chǔ)在“某個(gè)地方”的文件再次拿回到工作區(qū)仪召。
git stash 將當(dāng)前工作區(qū)所有修改過(guò)的內(nèi)容存儲(chǔ)到“某個(gè)地方”,將工作區(qū)還原到當(dāng)前版本未修改過(guò)的狀態(tài)
git stash list 查看“某個(gè)地方”存儲(chǔ)的所有記錄
git stash clear 清空“某個(gè)地方”
git stash pop 將第一個(gè)記錄從“某個(gè)地方”重新拿到工作區(qū)(可能有沖突)
git stash apply 編號(hào), 將指定編號(hào)記錄從“某個(gè)地方”重新拿到工作區(qū)(可能有沖突)
git stash drop 編號(hào)松蒜,刪除指定編號(hào)的記錄
90扔茅、git中rebase和merge命令的區(qū)別
https://www.cnblogs.com/xueweihan/p/5743327.html
91、公司如何用git進(jìn)行協(xié)同開(kāi)發(fā)
https://www.cnblogs.com/abelsu/p/5138136.html
92秸苗、如何基于git進(jìn)行代碼review
https://blog.csdn.net/maray/article/details/50206927
93召娜、git如何實(shí)現(xiàn)v1.0、v2.0等版本的管理
https://blog.csdn.net/zhazhaji/article/details/75258426
94惊楼、什么是gitlabGitLab 是一個(gè)用于倉(cāng)庫(kù)管理系統(tǒng)的開(kāi)源項(xiàng)目玖瘸,使用Git作為代碼管理工具秸讹,并在此基礎(chǔ)上搭建起來(lái)的web服務(wù)。安裝方法是參考GitLab在GitHub上的Wiki頁(yè)面雅倒。
95璃诀、GitHub和gitlab的區(qū)別
先說(shuō)一下相同點(diǎn),二者都是基于web的Git倉(cāng)庫(kù)蔑匣,在很大程度上GitLab是仿照GitHub來(lái)做的劣欢,它們都提供了分享開(kāi)源項(xiàng)目的平臺(tái),為開(kāi)發(fā)團(tuán)隊(duì)提供了存儲(chǔ)裁良、分享氧秘、發(fā)布和合作開(kāi)發(fā)項(xiàng)目的中心化云存儲(chǔ)的場(chǎng)所。
GitHub作為開(kāi)源代碼庫(kù)及版本控制系統(tǒng)趴久,擁有超過(guò)900萬(wàn)的開(kāi)發(fā)者用戶,目前仍然是最火的開(kāi)源項(xiàng)目托管系統(tǒng)搔确。GitHub同時(shí)提供公共倉(cāng)庫(kù)和私有倉(cāng)庫(kù)彼棍,但如果要使用私有倉(cāng)庫(kù),是需要付費(fèi)的膳算。
而GitLab解決了這個(gè)問(wèn)題座硕,你可以在上面創(chuàng)建私人的免費(fèi)倉(cāng)庫(kù)。
GitLab讓開(kāi)發(fā)團(tuán)隊(duì)對(duì)他們的代碼倉(cāng)庫(kù)擁有更多的控制涕蜂,相比于GitHub华匾,它有不少的特色:
允許免費(fèi)設(shè)置倉(cāng)庫(kù)權(quán)限;允許用戶選擇分享一個(gè)project的部分代碼机隙;允許用戶設(shè)置project的獲取權(quán)限蜘拉,進(jìn)一步的提升安全性;可以設(shè)置獲取到團(tuán)隊(duì)整體的改進(jìn)進(jìn)度有鹿;通過(guò)innersourcing讓不在權(quán)限范圍內(nèi)的人訪問(wèn)不到該資源旭旭。
從代碼私有性方面來(lái)看,有時(shí)公司并不希望員工獲取到全部的代碼葱跋,這個(gè)時(shí)候GitLab無(wú)疑是更好的選擇持寄。但對(duì)于開(kāi)源項(xiàng)目而言,GitHub依然是代碼托管的首選娱俺。
96稍味、如何為GitHub上的開(kāi)源項(xiàng)目貢獻(xiàn)代碼
對(duì)一個(gè)開(kāi)源項(xiàng)目有足夠了解的情況下,如果你發(fā)現(xiàn)問(wèn)題或者更好的解決方案的話荠卷,可以開(kāi)個(gè)issue先模庐。
一般情況下維護(hù)這個(gè)項(xiàng)目的人或者其他使用這個(gè)項(xiàng)目的人會(huì)參與討論的,然后基于這些討論你可以發(fā)一些pull requests僵朗。
如果你的方案得到很多人贊同的話赖欣,項(xiàng)目維護(hù)人員會(huì)把他們merge屑彻,你也就成了這個(gè)項(xiàng)目的contributor了。
當(dāng)然很多情況下顶吮,你開(kāi)的這個(gè)issue已經(jīng)有人提過(guò)了社牲,或者說(shuō)是你自己誤解了,但是相信在和其他開(kāi)發(fā)人員交流的過(guò)程中悴了,你也能學(xué)到許多搏恤。
97、git中.gitignore文件的作用
一般來(lái)說(shuō)每個(gè)Git項(xiàng)目中都需要一個(gè)“.gitignore”文件湃交,這個(gè)文件的作用就是告訴Git哪些文件不需要添加到版本管理中熟空。
實(shí)際項(xiàng)目中,很多文件都是不需要版本管理的搞莺,比如Python的.pyc文件和一些包含密碼的配置文件等等息罗。
98、什么是敏捷開(kāi)發(fā)
敏捷開(kāi)發(fā)以用戶的需求進(jìn)化為核心才沧,采用迭代迈喉、循序漸進(jìn)的方法進(jìn)行軟件開(kāi)發(fā)。在敏捷開(kāi)發(fā)中温圆,軟件項(xiàng)目在構(gòu)建初期被切分成多個(gè)子項(xiàng)目挨摸,各個(gè)子項(xiàng)目的成果都經(jīng)過(guò)測(cè)試,具備可視岁歉、可集成和可運(yùn)行使用的特征得运。換言之,就是把一個(gè)大項(xiàng)目分為多個(gè)相互聯(lián)系锅移,但也可獨(dú)立運(yùn)行的小項(xiàng)目熔掺,并分別完成,在此過(guò)程中軟件一直處于可使用狀態(tài)帆啃。
99瞬女、簡(jiǎn)述jenkins工具的作用
Jenkins是一個(gè)開(kāi)源軟件項(xiàng)目,是基于Java開(kāi)發(fā)的一種持續(xù)集成工具努潘,用于監(jiān)控持續(xù)重復(fù)的工作诽偷,旨在提供一個(gè)開(kāi)放易用的軟件平臺(tái),使軟件的持續(xù)集成變成可能疯坤。
100报慕、公司如何實(shí)現(xiàn)代碼發(fā)布
1、開(kāi)發(fā)人員提交代碼更新压怠,主要提交的字段包括“更新理由”户秤,“svn代碼路徑”;
2崇败、后端收到請(qǐng)求后澎语,把此數(shù)據(jù)插入到數(shù)據(jù)庫(kù),標(biāo)記此更新單為“等待預(yù)發(fā)布環(huán)境更新”的狀態(tài);
3布卡、后臺(tái)進(jìn)程定時(shí)查詢是否有等待預(yù)發(fā)布環(huán)境更新的更新單,如果有雇盖,讀取svn路徑忿等,執(zhí)行svn up更新代碼操作,并標(biāo)記此更新單為“預(yù)發(fā)布環(huán)境已更新,等待完成測(cè)試”;
4崔挖、開(kāi)發(fā)人員或者測(cè)試人員通過(guò)預(yù)發(fā)布環(huán)境的域名來(lái)測(cè)試功能是否正常贸街,如果不正常,作代碼修改后提交svn狸相,再到web發(fā)布后臺(tái)點(diǎn)擊“返回修改”薛匪,對(duì)svn路徑或者不做任何修改再點(diǎn)擊“重新提交”,然后更新單又一次回到”等待預(yù)發(fā)布環(huán)境更新“狀態(tài)脓鹃。循環(huán)3逸尖、4步驟,直至預(yù)發(fā)布環(huán)境測(cè)試通過(guò)為止;
5瘸右、在確認(rèn)測(cè)試通過(guò)后冷溶,開(kāi)發(fā)人員點(diǎn)擊”測(cè)試通過(guò)“,這時(shí)更新單進(jìn)入”等待審核狀態(tài)“;
6尊浓、負(fù)責(zé)人確認(rèn)可以發(fā)布后,點(diǎn)擊”審批“按鈕纯衍,這時(shí)更新單進(jìn)入”審核通過(guò)栋齿,等待執(zhí)行發(fā)布操作“的狀態(tài)。這時(shí),開(kāi)發(fā)人員得到發(fā)布代碼的授權(quán);
7襟诸、開(kāi)發(fā)人員點(diǎn)擊”發(fā)布代碼“按鈕瓦堵,更新單進(jìn)入”已執(zhí)行發(fā)布,等待系統(tǒng)完成發(fā)布“狀態(tài);
8歌亲、后臺(tái)進(jìn)程查詢狀態(tài)為”已執(zhí)行發(fā)布菇用,等待系統(tǒng)完成發(fā)布“的更新單,執(zhí)行g(shù)it發(fā)布命令陷揪。git命令大概為惋鸥,進(jìn)入預(yù)發(fā)布代碼目錄,執(zhí)行g(shù)it add .;git commit -m “更新原因”;git tag 上一次版本號(hào)+1悍缠,再進(jìn)入已發(fā)布代碼的目錄,執(zhí)行g(shù)it pull同步預(yù)發(fā)布代碼目錄的更改卦绣。最后調(diào)用rsync命令同步代碼到生產(chǎn)環(huán)境。
http://blog.jobbole.com/110304/
101飞蚓、簡(jiǎn)述RabbitMQ滤港、Kafka和ZeroMQ的區(qū)別
RabbitMQ
RabbitMQ是使用Erlang編寫(xiě)的一個(gè)開(kāi)源的消息隊(duì)列,本身支持很多的協(xié)議:AMQP趴拧,XMPP, SMTP, STOMP溅漾,也正因如此山叮,它非常重量級(jí),更適合于企業(yè)級(jí)的開(kāi)發(fā)添履。同時(shí)實(shí)現(xiàn)了Broker構(gòu)架屁倔,這意味著消息在發(fā)送給客戶端時(shí)先在中心隊(duì)列排隊(duì)。對(duì)路由缝龄,負(fù)載均衡或者數(shù)據(jù)持久化都有很好的支持汰现。
Redis
Redis是一個(gè)基于Key-Value對(duì)的NoSQL數(shù)據(jù)庫(kù),開(kāi)發(fā)維護(hù)很活躍叔壤。雖然它是一個(gè)Key-Value數(shù)據(jù)庫(kù)存儲(chǔ)系統(tǒng)瞎饲,但它本身支持MQ功能,所以完全可以當(dāng)做一個(gè)輕量級(jí)的隊(duì)列服務(wù)來(lái)使用炼绘。對(duì)于RabbitMQ和Redis的入隊(duì)和出隊(duì)操作嗅战,各執(zhí)行100萬(wàn)次,每10萬(wàn)次記錄一次執(zhí)行時(shí)間俺亮。測(cè)試數(shù)據(jù)分為128Bytes驮捍、512Bytes、1K和10K四個(gè)不同大小的數(shù)據(jù)脚曾。實(shí)驗(yàn)表明:入隊(duì)時(shí)东且,當(dāng)數(shù)據(jù)比較小時(shí)Redis的性能要高于RabbitMQ,而如果數(shù)據(jù)大小超過(guò)了10K本讥,Redis則慢的無(wú)法忍受珊泳;出隊(duì)時(shí),無(wú)論數(shù)據(jù)大小拷沸,Redis都表現(xiàn)出非常好的性能色查,而RabbitMQ的出隊(duì)性能則遠(yuǎn)低于Redis。
ZeroMQ
ZeroMQ號(hào)稱(chēng)最快的消息隊(duì)列系統(tǒng)撞芍,尤其針對(duì)大吞吐量的需求場(chǎng)景秧了。ZeroMQ能夠?qū)崿F(xiàn)RabbitMQ不擅長(zhǎng)的高級(jí)/復(fù)雜的隊(duì)列,但是開(kāi)發(fā)人員需要自己組合多種技術(shù)框架序无,技術(shù)上的復(fù)雜度是對(duì)這MQ能夠應(yīng)用成功的挑戰(zhàn)验毡。ZeroMQ具有一個(gè)獨(dú)特的非中間件的模式,你不需要安裝和運(yùn)行一個(gè)消息服務(wù)器或中間件帝嗡,因?yàn)槟愕膽?yīng)用程序?qū)缪葸@個(gè)服務(wù)器角色米罚。你只需要簡(jiǎn)單的引用ZeroMQ程序庫(kù),可以使用NuGet安裝丈探,然后你就可以愉快的在應(yīng)用程序之間發(fā)送消息了录择。但是ZeroMQ僅提供非持久性的隊(duì)列,也就是說(shuō)如果宕機(jī),數(shù)據(jù)將會(huì)丟失隘竭。其中塘秦,Twitter的Storm 0.9.0以前的版本中默認(rèn)使用ZeroMQ作為數(shù)據(jù)流的傳輸(Storm從0.9版本開(kāi)始同時(shí)支持ZeroMQ和Netty作為傳輸模塊)。
ActiveMQ
ActiveMQ是Apache下的一個(gè)子項(xiàng)目动看。 類(lèi)似于ZeroMQ尊剔,它能夠以代理人和點(diǎn)對(duì)點(diǎn)的技術(shù)實(shí)現(xiàn)隊(duì)列。同時(shí)類(lèi)似于RabbitMQ菱皆,它少量代碼就可以高效地實(shí)現(xiàn)高級(jí)應(yīng)用場(chǎng)景须误。
Kafka/Jafka
Kafka是Apache下的一個(gè)子項(xiàng)目,是一個(gè)高性能跨語(yǔ)言分布式發(fā)布/訂閱消息隊(duì)列系統(tǒng)仇轻,而Jafka是在Kafka之上孵化而來(lái)的京痢,即Kafka的一個(gè)升級(jí)版。具有以下特性:快速持久化篷店,可以在O(1)的系統(tǒng)開(kāi)銷(xiāo)下進(jìn)行消息持久化祭椰;高吞吐,在一臺(tái)普通的服務(wù)器上既可以達(dá)到10W/s的吞吐速率疲陕;完全的分布式系統(tǒng)方淤,Broker、Producer蹄殃、Consumer都原生自動(dòng)支持分布式携茂,自動(dòng)實(shí)現(xiàn)負(fù)載均衡;支持Hadoop數(shù)據(jù)并行加載诅岩,對(duì)于像Hadoop的一樣的日志數(shù)據(jù)和離線分析系統(tǒng)邑蒋,但又要求實(shí)時(shí)處理的限制,這是一個(gè)可行的解決方案按厘。Kafka通過(guò)Hadoop的并行加載機(jī)制統(tǒng)一了在線和離線的消息處理。Apache Kafka相對(duì)于ActiveMQ是一個(gè)非常輕量級(jí)的消息系統(tǒng)钱慢,除了性能非常好之外逮京,還是一個(gè)工作良好的分布式系統(tǒng)。
102束莫、RabbitMQ如何在消費(fèi)者獲取任務(wù)后未處理完前就掛掉時(shí)懒棉,保持?jǐn)?shù)據(jù)不丟失
103、RabbitMQ如何對(duì)消息做持久化
https://www.cnblogs.com/xiangjun555/articles/7874006.html
104览绿、RabbitMQ如何控制消息被消費(fèi)的順序
https://blog.csdn.net/varyall/article/details/79111745
105策严、以下RabbitMQ的exchange type分別代表什么意思,如:fanout饿敲、direct妻导、topic
https://www.cnblogs.com/shenyixin/p/9084249.html
106、簡(jiǎn)述一下celery是什么以及應(yīng)用場(chǎng)景
Celery是由Python開(kāi)發(fā)的一個(gè)簡(jiǎn)單、靈活倔韭、可靠的處理大量任務(wù)的分發(fā)系統(tǒng)术浪,它不僅支持實(shí)時(shí)處理也支持任務(wù)調(diào)度。
http://www.cnblogs.com/wupeiqi/articles/8796552.html
107寿酌、簡(jiǎn)述celery的運(yùn)行機(jī)制
108胰苏、celery如何實(shí)現(xiàn)定時(shí)任務(wù)
109、簡(jiǎn)述celery多任務(wù)結(jié)構(gòu)目錄
110醇疼、celery中裝飾器@app.task和@shared_task的區(qū)別
111硕并、簡(jiǎn)述requests模塊的作用及基本使用
模擬瀏覽器發(fā)送請(qǐng)求
http://www.cnblogs.com/linhaifeng/articles/7785043.html
112、簡(jiǎn)述Beautifulsoup模塊的作用及基本使用
Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù)
http://www.cnblogs.com/linhaifeng/articles/7783586.html
113秧荆、簡(jiǎn)述selenium模塊的作用及基本使用
selenium最初是一個(gè)自動(dòng)化測(cè)試工具,而爬蟲(chóng)中使用它主要是為了解決requests無(wú)法直接執(zhí)行JavaScript代碼的問(wèn)題
selenium本質(zhì)是通過(guò)驅(qū)動(dòng)瀏覽器倔毙,完全模擬瀏覽器的操作,比如跳轉(zhuǎn)辰如、輸入普监、點(diǎn)擊、下拉等琉兜,來(lái)拿到網(wǎng)頁(yè)渲染之后的結(jié)果凯正,可支持多種瀏覽器
http://www.cnblogs.com/linhaifeng/articles/7783599.html
114、scrapy框架中各組件的工作流程
1豌蟋、生成初始的Requests來(lái)爬取第一個(gè)URLS廊散,并且標(biāo)識(shí)一個(gè)回調(diào)函數(shù)
第一個(gè)請(qǐng)求定義在start_requests()方法內(nèi)默認(rèn)從start_urls列表中獲得url地址來(lái)生成Request請(qǐng)求,默認(rèn)的回調(diào)函數(shù)是parse方法梧疲≡识茫回調(diào)函數(shù)在下載完成返回response時(shí)自動(dòng)觸發(fā)
2、在回調(diào)函數(shù)中幌氮,解析response并且返回值
返回值可以4種:
包含解析數(shù)據(jù)的字典
Item對(duì)象
新的Request對(duì)象(新的Requests也需要指定一個(gè)回調(diào)函數(shù))
或者是可迭代對(duì)象(包含Items或Request)
3缭受、在回調(diào)函數(shù)中解析頁(yè)面內(nèi)容
通常使用Scrapy自帶的Selectors,但很明顯你也可以使用Beutifulsoup该互,lxml或其他你愛(ài)用啥用啥米者。
4、最后宇智,針對(duì)返回的Items對(duì)象將會(huì)被持久化到數(shù)據(jù)庫(kù)
通過(guò)Item Pipeline組件存到數(shù)據(jù)庫(kù):https://docs.scrapy.org/en/latest/topics/item-pipeline.html#topics-item-pipeline)
或者導(dǎo)出到不同的文件(通過(guò)Feed exports:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports)
http://www.cnblogs.com/linhaifeng/articles/7811861.html
115蔓搞、scrapy中如何設(shè)置代理(兩種方式)
scrapy自帶的代理組件:
from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
from urllib.request import getproxies
116、scrapy框架中如何實(shí)現(xiàn)大文件的下載
持久化時(shí):
from twisted.web.client import Agent, getPage, ResponseDone, PotentialDataLoss
from twisted.internet import defer, reactor, protocol
from twisted.web._newclient import Response
from io import BytesIO
class _ResponseReader(protocol.Protocol):
def __init__(self, finished, txresponse, file_name):
self._finished = finished
self._txresponse = txresponse
self._bytes_received = 0
self.f = open(file_name, mode='wb')
def dataReceived(self, bodyBytes):
self._bytes_received += len(bodyBytes)
# 一點(diǎn)一點(diǎn)的下載
self.f.write(bodyBytes)
self.f.flush()
def connectionLost(self, reason):
if self._finished.called:
return
if reason.check(ResponseDone):
# 下載完成
self._finished.callback((self._txresponse, 'success'))
elif reason.check(PotentialDataLoss):
# 下載部分
self._finished.callback((self._txresponse, 'partial'))
else:
# 下載異常
self._finished.errback(reason)
self.f.close()
117随橘、scrapy中如何實(shí)現(xiàn)限速
http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/autothrottle.html
118喂分、scrapy中如何實(shí)現(xiàn)暫定爬蟲(chóng)
有些情況下,例如爬取大的站點(diǎn)机蔗,我們希望能暫停爬取蒲祈,之后再恢復(fù)運(yùn)行甘萧。
Scrapy通過(guò)如下工具支持這個(gè)功能:
一個(gè)把調(diào)度請(qǐng)求保存在磁盤(pán)的調(diào)度器
一個(gè)把訪問(wèn)請(qǐng)求保存在磁盤(pán)的副本過(guò)濾器[duplicates filter]
一個(gè)能持續(xù)保持爬蟲(chóng)狀態(tài)(鍵/值對(duì))的擴(kuò)展
Job 路徑
要啟用持久化支持,你只需要通過(guò) JOBDIR 設(shè)置 job directory 選項(xiàng)讳嘱。這個(gè)路徑將會(huì)存儲(chǔ) 所有的請(qǐng)求數(shù)據(jù)來(lái)保持一個(gè)單獨(dú)任務(wù)的狀態(tài)(例如:一次spider爬取(a spider run))幔嗦。必須要注意的是,這個(gè)目錄不允許被不同的spider 共享沥潭,甚至是同一個(gè)spider的不同jobs/runs也不行邀泉。也就是說(shuō),這個(gè)目錄就是存儲(chǔ)一個(gè) 單獨(dú) job的狀態(tài)信息钝鸽。
https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/jobs.html?highlight=item
119汇恤、scrapy中如何進(jìn)行自定制命令
在spiders同級(jí)創(chuàng)建任意目錄,如:commands
在其中創(chuàng)建 crawlall.py 文件 (此處文件名就是自定義的命令)
from scrapy.commands import ScrapyCommand
from scrapy.utils.project import get_project_settings
class Command(ScrapyCommand):
requires_project = True
def syntax(self):
return '[options]'
def short_desc(self):
return 'Runs all of the spiders'
def run(self, args, opts):
spider_list = self.crawler_process.spiders.list()
for name in spider_list:
self.crawler_process.crawl(name, **opts.__dict__)
self.crawler_process.start()
在settings.py 中添加配置 COMMANDS_MODULE = '項(xiàng)目名稱(chēng).目錄名稱(chēng)'
在項(xiàng)目目錄執(zhí)行命令:scrapy crawlall
http://www.cnblogs.com/wupeiqi/articles/6229292.html
120拔恰、scrapy中如何實(shí)現(xiàn)記錄爬蟲(chóng)深度
class scrapy.contrib.spidermiddleware.depth.DepthMiddleware
DepthMiddleware是一個(gè)用于追蹤每個(gè)Request在被爬取的網(wǎng)站的深度的中間件因谎。 其可以用來(lái)限制爬取深度的最大深度或類(lèi)似的事情。
DepthMiddleware 可以通過(guò)下列設(shè)置進(jìn)行配置(更多內(nèi)容請(qǐng)參考設(shè)置文檔):
DEPTH_LIMIT - 爬取所允許的最大深度颜懊,如果為0财岔,則沒(méi)有限制。
DEPTH_STATS - 是否收集爬取狀態(tài)河爹。
DEPTH_PRIORITY - 是否根據(jù)其深度對(duì)requet安排優(yōu)先級(jí)
121匠璧、scrapy中pipelines工作原理
Scrapy 提供了 pipeline 模塊來(lái)執(zhí)行保存數(shù)據(jù)的操作。在創(chuàng)建的 Scrapy 項(xiàng)目中自動(dòng)創(chuàng)建了一個(gè) pipeline.py 文件咸这,同時(shí)創(chuàng)建了一個(gè)默認(rèn)的 Pipeline 類(lèi)夷恍。我們可以根據(jù)需要自定義 Pipeline 類(lèi),然后在 settings.py 文件中進(jìn)行配置即可
https://blog.csdn.net/Ahri_J/article/details/72472170
122媳维、scrapy中pipelines中如何丟棄一個(gè)item對(duì)象
123酿雪、scarpy中爬蟲(chóng)中間件和下載中間件的作用
http://www.cnblogs.com/wupeiqi/articles/6229292.html
124、scrapy-redis組件的作用
scheduler - 調(diào)度器
dupefilter - URL去重規(guī)則(被調(diào)度器使用)
pipeline - 數(shù)據(jù)持久化
125侄刽、scrapy-redis組件中如何實(shí)現(xiàn)任務(wù)去重
定義去重規(guī)則(被調(diào)度器調(diào)用并應(yīng)用)
a. 內(nèi)部會(huì)使用以下配置進(jìn)行連接Redis
# REDIS_HOST = 'localhost' # 主機(jī)名
# REDIS_PORT = 6379 # 端口
# REDIS_URL = 'redis://user:pass@hostname:9001' # 連接URL(優(yōu)先于以上配置)
# REDIS_PARAMS = {} # Redis連接參數(shù) 默認(rèn):REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
# REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定連接Redis的Python模塊 默認(rèn):redis.StrictRedis
# REDIS_ENCODING = "utf-8" # redis編碼類(lèi)型 默認(rèn):'utf-8'
b. 去重規(guī)則通過(guò)redis的集合完成指黎,集合的Key為:
key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())}
默認(rèn)配置:
DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'
c. 去重規(guī)則中將url轉(zhuǎn)換成唯一標(biāo)示,然后在redis中檢查是否已經(jīng)在集合中存在
from scrapy.utils import request
from scrapy.http import Request
req = Request(url='http://www.cnblogs.com/wupeiqi.html')
result = request.request_fingerprint(req)
print(result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c
PS:
- URL參數(shù)位置不同時(shí)州丹,計(jì)算結(jié)果一致醋安;
- 默認(rèn)請(qǐng)求頭不在計(jì)算范圍,include_headers可以設(shè)置指定請(qǐng)求頭
示例:
from scrapy.utils import request
from scrapy.http import Request
req = Request(url='http://www.baidu.com?name=8&id=1',callback=lambda x:print(x),cookies={'k1':'vvvvv'})
result = request.request_fingerprint(req,include_headers=['cookies',])
print(result)
req = Request(url='http://www.baidu.com?id=1&name=8',callback=lambda x:print(x),cookies={'k1':666})
result = request.request_fingerprint(req,include_headers=['cookies',])
print(result)
"""
Ensure all spiders share same duplicates filter through redis.
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
126当叭、scrapy-redis中的調(diào)度器如何實(shí)現(xiàn)任務(wù)的深度優(yōu)先和廣度優(yōu)先
http://www.cnblogs.com/wupeiqi/articles/6912807.html
127、簡(jiǎn)述virtualenv的作用
virtualenv就是用來(lái)為一個(gè)應(yīng)用創(chuàng)建一套“隔離”的Python運(yùn)行環(huán)境盖灸。
https://www.cnblogs.com/technologylife/p/6635631.html
128蚁鳖、簡(jiǎn)述pipreqs及應(yīng)用場(chǎng)景
查找python項(xiàng)目依賴并生成requirements.txt
https://www.cnblogs.com/bonelee/p/8183038.html
129、在python中使用過(guò)什么代碼檢查工具
1)PyFlakes:靜態(tài)檢查Python代碼邏輯錯(cuò)誤的工具赁炎。
2)Pep8: 靜態(tài)檢查PEP8編碼風(fēng)格的工具醉箕。
3)NedBatchelder’s McCabe script:靜態(tài)分析Python代碼復(fù)雜度的工具钾腺。
Python代碼分析工具:PyChecker、Pylint
130讥裤、簡(jiǎn)述saltstack放棒、ansible、fabric己英、puppet工具的作用
131间螟、B Tree和B+ Tree的區(qū)別
http://www.reibang.com/p/0371c9569736
132、請(qǐng)列舉常見(jiàn)的排序并通過(guò)代碼實(shí)現(xiàn)任意三種
冒泡/選擇/插入/快排
https://www.cnblogs.com/Liqiongyu/p/5911613.html
http://www.cnblogs.com/feixuelove1009/p/6143539.html
133损肛、請(qǐng)列舉常見(jiàn)的查照并通過(guò)代碼實(shí)現(xiàn)任意三種
無(wú)序查找/二分查找/插值查找
http://www.cnblogs.com/feixuelove1009/p/6148357.html
134厢破、請(qǐng)列舉你熟悉的設(shè)計(jì)模式
工廠模式/單例模式等
https://www.cnblogs.com/Liqiongyu/p/5916710.html
135、有沒(méi)有刷過(guò)LeetCode
https://leetcode-cn.com/problemset/all/
136治拿、列舉熟悉的Linux命令
- mkdir –p 創(chuàng)建多級(jí)目錄
- ls -l 顯示詳細(xì)信息
- cd change directory 進(jìn)入到目錄中
- pwd print working directory 顯示當(dāng)前所在位置
- touch 創(chuàng)建文件 修改文件的時(shí)間戳
- vi 編輯文件
- cat 顯示文件內(nèi)容
- cp copy 復(fù)制
- mv move 移動(dòng)
- rm 刪除文件或目錄 -f 強(qiáng)制刪除不提示 -r 遞歸刪除目錄 慎用
- find 查找 -type f(file) d(dir) -name 名字
- grep 過(guò)濾 -v 排除
- head 顯示文件的前幾行 默認(rèn)顯示文件的前10行 -n2 === -2 顯示文件的前2行
- tail 顯示文件的最后幾行 默認(rèn)顯示文件的后10行
-n1 === -1 顯示文件的最后1行
-f 實(shí)時(shí)顯示文件的更新 - sed 取行
-n 取消默認(rèn)輸出
-i 修改文件的內(nèi)容 - tar 創(chuàng)建解壓查看壓縮包
- yum install yum install -y
- ping baidu.com
137摩泪、解釋PV、UV的含義
PV訪問(wèn)量(Page View)劫谅,即頁(yè)面訪問(wèn)量见坑,每打開(kāi)一次頁(yè)面PV計(jì)數(shù)+1,刷新頁(yè)面也是捏检。
IP訪問(wèn)數(shù)指獨(dú)立IP訪問(wèn)數(shù)荞驴,計(jì)算是以一個(gè)獨(dú)立的IP在一個(gè)計(jì)算時(shí)段內(nèi)訪問(wèn)網(wǎng)站計(jì)算為1次IP訪問(wèn)數(shù)。在同一個(gè)計(jì)算時(shí)段內(nèi)不管這個(gè)IP訪問(wèn)多少次均計(jì)算為1次未檩。計(jì)算時(shí)段有以1天為一個(gè)計(jì)算時(shí)段戴尸,也有以1個(gè)小時(shí)為一個(gè)計(jì)算時(shí)段。
UV訪問(wèn)數(shù)(Unique Visitor)指獨(dú)立訪客訪問(wèn)數(shù)冤狡,一臺(tái)電腦終端為一個(gè)訪客孙蒙。
在同一個(gè)局域網(wǎng)中對(duì)互聯(lián)網(wǎng)訪問(wèn)時(shí)對(duì)外通常是同一個(gè)IP,如果該局域網(wǎng)中有10臺(tái)終端在同一個(gè)計(jì)算時(shí)段內(nèi)訪問(wèn)同一個(gè)網(wǎng)站悲雳,對(duì)該網(wǎng)站的獨(dú)立IP訪問(wèn)數(shù)貢獻(xiàn)為1挎峦,而不是10。而此時(shí)UV訪問(wèn)數(shù)則為10合瓢。
138坦胶、解釋QPS的含義
Query Per Second
每秒查詢率QPS是對(duì)一個(gè)特定的查詢服務(wù)器在規(guī)定時(shí)間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)。
139晴楔、uwsgi和wsgi的區(qū)別
WSGI:全稱(chēng)是Web Server Gateway Interface顿苇,WSGI不是服務(wù)器,python模塊税弃,框架纪岁,API或者任何軟件,只是一種規(guī)范则果,描述web server如何與web application通信的規(guī)范幔翰。server和application的規(guī)范在PEP 3333中有具體描述漩氨。要實(shí)現(xiàn)WSGI協(xié)議,必須同時(shí)實(shí)現(xiàn)web server和web application遗增,當(dāng)前運(yùn)行在WSGI協(xié)議之上的web框架有Bottle, Flask, Django叫惊。
uwsgi:與WSGI一樣是一種通信協(xié)議,是uWSGI服務(wù)器的獨(dú)占協(xié)議做修,用于定義傳輸信息的類(lèi)型(type of information)霍狰,每一個(gè)uwsgi packet前4byte為傳輸信息類(lèi)型的描述,與WSGI協(xié)議是兩種東西缓待,據(jù)說(shuō)該協(xié)議是fcgi協(xié)議的10倍快蚓耽。
uWSGI:是一個(gè)web服務(wù)器,實(shí)現(xiàn)了WSGI協(xié)議旋炒、uwsgi協(xié)議步悠、http協(xié)議等。
http://www.reibang.com/p/679dee0a4193
140瘫镇、supervisor的作用
supervisor管理進(jìn)程鼎兽,是通過(guò)fork/exec的方式將這些被管理的進(jìn)程當(dāng)作supervisor的子進(jìn)程來(lái)啟動(dòng),所以我們只需要將要管理進(jìn)程的可執(zhí)行文件的路徑添加到supervisor的配置文件中就好了铣除。此時(shí)被管理進(jìn)程被視為supervisor的子進(jìn)程谚咬,若該子進(jìn)程異常終端,則父進(jìn)程可以準(zhǔn)確的獲取子進(jìn)程異常終端的信息尚粘,通過(guò)在配置文件中設(shè)置autostart=ture择卦,可以實(shí)現(xiàn)對(duì)異常中斷的子進(jìn)程的自動(dòng)重啟。
141郎嫁、什么是反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求秉继,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端泽铛,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器尚辑。
142、簡(jiǎn)述SSH的整個(gè)過(guò)程
SSH 為 Secure Shell 的縮寫(xiě)盔腔,由 IETF 的網(wǎng)絡(luò)小組(Network Working Group)所制定杠茬;SSH 為建立在應(yīng)用層基礎(chǔ)上的安全協(xié)議。SSH 是目前較可靠弛随,專(zhuān)為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議瓢喉。利用 SSH 協(xié)議可以有效防止遠(yuǎn)程管理過(guò)程中的信息泄露問(wèn)題。
http://www.reibang.com/p/33461b619d53
143舀透、最近研究什么新技術(shù)
emmmm........ NP完全問(wèn)題栓票、霍奇猜想、龐加萊猜想盐杂、黎曼假設(shè)逗载、楊-米爾斯存在性和質(zhì)量缺口、納衛(wèi)爾-斯托可方程链烈、BSD猜想
144厉斟、是否了解過(guò)領(lǐng)域驅(qū)動(dòng)模型
Domain-Driven Design
https://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html