Django 的認識,面試題
1. 對Django的認識?
#1.Django是走大而全的方向,它最出名的是其全自動化的管理后台:只需要使用起ORM,做簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理后台。 #2.Django內置的ORM跟框架內的其他模塊耦合程度高。 #應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基於其ORM的便利; #理論上可以切換掉其ORM模塊,但這就相當於要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。 #3.Django的賣點是超高的開發效率,其性能擴展有限;采用Django的項目,在流量達到一定規模后,都需要對其進行重構,才能滿足性能的要求。 #4.Django適用的是中小型的網站,或者是作為大型網站快速實現產品雛形的工具。 #5.Django模板的設計哲學是徹底的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數據的可能。
2. Django 、Flask、Tornado的對比
#1.Django走的是大而全的方向,開發效率高。它的MTV框架,自帶的ORM,admin后台管理,自帶的sqlite數據庫和開發測試用的服務器 #給開發者提高了超高的開發效率 #2.Flask是輕量級的框架,自由,靈活,可擴展性很強,核心基於Werkzeug WSGI工具和jinja2模板引擎 #3.Tornado走的是少而精的方向,性能優越。它最出名的是異步非阻塞的設計方式 #Tornado的兩大核心模塊: # 1.iostraem:對非阻塞式的socket進行簡單的封裝 # 2.ioloop:對I/O多路復用的封裝,它實現了一個單例
3. 什么是wsgi,uwsgi,uWSGI?
#WSGI: # web服務器網關接口,是一套協議。用於接收用戶請求並將請求進行初次封裝,然后將請求交給web框架 # 實現wsgi協議的模塊: # 1.wsgiref,本質上就是編寫一個socket服務端,用於接收用戶請求(django) # 2.werkzeug,本質上就是編寫一個socket服務端,用於接收用戶請求(flask) #uwsgi: # 與WSGI一樣是一種通信協議,它是uWSGI服務器的獨占協議,用於定義傳輸信息的類型 #uWSGI: # 是一個web服務器,實現了WSGI協議,uWSGI協議,http協議,
4. django請求的生命周期?
#1.wsgi,請求封裝后交給web框架 (Flask、Django) #2.中間件,對請求進行校驗或在請求對象中添加其他相關數據,例如:csrf、request.session - #3.路由匹配 根據瀏覽器發送的不同url去匹配不同的視圖函數 #4.視圖函數,在視圖函數中進行業務邏輯的處理,可能涉及到:orm、templates => 渲染 - #5.中間件,對響應的數據進行處理。 #6.wsgi,將響應的內容發送給瀏覽器。
5. 簡述什么是FBV和CBV?
#FBV和CBV本質是一樣的 #基於函數的視圖叫做FBV,基於類的視圖叫做CBV #在python中使用CBV的優點: #1.提高了代碼的復用性,可以使用面向對象的技術,比如Mixin(多繼承) #2.可以用不同的函數針對不同的HTTP方法處理,而不是通過很多if判斷,提高代碼可讀性
6. 如何給CBV的程序添加裝飾器?
#引入method_decorator模塊 #1.直接在類上加裝飾器 #@method_decorator(test,name='dispatch') #class Loginview(View): # pass #2.直接在處理的函數前加裝飾器 #@method_decorator(test) # def post(self,request,*args,**kwargs):pass
7. 簡述MVC和MTV
#MVC軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller) #Model:負責業務對象與數據庫的映射(ORM) #View:負責與用戶的交互 #Control:接受用戶的輸入調用模型和視圖完成用戶的請求 #Django框架的MTV設計模式借鑒了MVC框架的思想,三部分為:Model、Template和View #Model(模型):負責業務對象與數據庫的對象(ORM) #Template(模版):負責如何把頁面展示給用戶 #View(視圖):負責業務邏輯,並在適當的時候調用Model和Template #此外,Django還有一個urls分發器, #它將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template
8. django路由系統中name的作用?
#用於反向解析路由,相當於給url取個別名,只要這個名字不變,即使對應的url改變 #通過該名字也能找到該條url
9. 列舉django的內置組件?
#1.Admin是對model中對應的數據表進行增刪改查提供的組件 #2.model組件:負責操作數據庫 #3.form組件:1.生成HTML代碼2.數據有效性校驗3校驗信息返回並展示 #4.ModelForm組件即用於數據庫操作,也可用於用戶請求的驗證
10. 說一下Django,MIDDLEWARES中間件的作用和應用場景?
#中間件是介於request與response處理之間的一道處理過程,用於在全局范圍內改變Django的輸入和輸出。 #簡單的來說中間件是幫助我們在視圖函數執行之前和執行之后都可以做一些額外的操作 #例如: #1.Django項目中默認啟用了csrf保護,每次請求時通過CSRF中間件檢查請求中是否有正確#token值 #2.當用戶在頁面上發送請求時,通過自定義的認證中間件,判斷用戶是否已經登陸,未登陸就去登陸。 #3.當有用戶請求過來時,判斷用戶是否在白名單或者在黑名單里
11. 列舉django中間件的5個方法?
#1.process_request : 請求進來時,權限認證 #2.process_view : 路由匹配之后,能夠得到視圖函數 #3.process_exception : 異常時執行 #4.process_template_responseprocess : 模板渲染時執行 #5.process_response : 請求有響應時執行
12. django的request對象是在什么時候創建的?
#class WSGIHandler(base.BaseHandler): # request = self.request_class(environ) #請求走到WSGIHandler類的時候,執行__cell__方法,將environ封裝成了request
13. Django重定向是如何實現的?用的什么狀態碼?
#1.使用HttpResponseRedirect #from django.http import HttpResponseRedirect #2.使用redirect和reverse #狀態碼:301和302 #301和302的區別: #相同點:都表示重定向,瀏覽器在拿到服務器返回的這個狀態碼后會自動跳轉到一個新的URL地址 #不同點: #301比較常用的場景是使用域名跳轉。比如,我們訪問 http://www.baidu.com 會跳轉到 https://www.baidu.com #表示舊地址A的資源已經被永久地移除了 #302用來做臨時跳轉,比如未登陸的用戶訪問用戶中心重定向到登錄頁面。表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B
14. xxss攻擊
#-- XSS攻擊是向網頁中注入惡意腳本,用在用戶瀏覽網頁時,在用戶瀏覽器中執行惡意腳本的攻擊。 # -- XSS分類,反射型xss ,存儲型xss # -- 反射型xss又稱為非持久型xss,攻擊者通過電子郵件等方式將包含注入腳本的鏈接發送給受害者, # 受害者通過點擊鏈接,執行注入腳本,達到攻擊目的。 # -- 持久型xss跟反射型的最大不同是攻擊腳本將被永久的存放在目標服務器的數據庫和文件中,多見於論壇 # 攻擊腳本連同正常信息一同注入到帖子內容當中,當瀏覽這個被注入惡意腳本的帖子的時候,惡意腳本會被執行 # -- 防范措施 1 輸入過濾 2 輸出編碼 3 cookie防盜 # 1,輸入過濾 用戶輸入進行檢測 不允許帶有js代碼 # 2,輸出編碼 就是把我們的腳本代碼變成字符串形式輸出出來 # 3,cookie加密 #向頁面注入惡意的代碼,這些代碼被瀏覽器執行 #XSS攻擊能做些什么: # 1.竊取cookies # 2.讀取用戶未公開的資料,如果:郵件列表或者內容、系統的客戶資料,聯系人列表 #解決方法: # 1.客戶度端:表單提交之前或者url傳遞之前,對需要的參數進行過濾 # 2.服務器端:檢查用戶輸入的內容是否有非法內容
15. django中csrf的實現機制
#第一步:django第一次響應來自某個客戶端的請求時,后端隨機產生一個token值,把這個token保存在SESSION狀態中;同時,后端把這個token放到cookie中交給前端頁面; #第二步:下次前端需要發起請求(比如發帖)的時候把這個token值加入到請求數據或者頭信息中,一起傳給后端;Cookies:{csrftoken:xxxxx} #第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致;
16. 基於django使用ajax發送post請求時,都可以使用哪種方法攜帶csrf token?
#1.后端將csrftoken傳到前端,發送post請求時攜帶這個值發送 data: { csrfmiddlewaretoken: '{{ csrf_token }}' }, #2.獲取form中隱藏標簽的csrftoken值,加入到請求數據中傳給后端 data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() }, #3.cookie中存在csrftoken,將csrftoken值放到請求頭中 headers:{ "X-CSRFtoken":$.cookie("csrftoken")},
17. Django本身提供了runserver,為什么不能用來部署?(runserver與uWSGI的區別)
#1.runserver方法是調試 Django 時經常用到的運行方式,它使用Django自帶的 #WSGI Server 運行,主要在測試和開發中使用,並且 runserver 開啟的方式也是單進程 。 #2.uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http 等協議。注意uwsgi是一種通信協議,而uWSGI是實現uwsgi協議和WSGI協議的 Web 服務器。 #uWSGI具有超快的性能、低內存占用和多app管理等優點,並且搭配着Nginx就是一個生產環境了,能夠將用戶訪問請求與應用 app 隔離開,實現真正的部署 。 #相比來講,支持的並發量更高,方便管理多進程,發揮多核的優勢,提升性能。
18. cookie和session的區別:
#1.cookie: # cookie是保存在瀏覽器端的鍵值對,可以用來做用戶認證 #2.session: # 將用戶的會話信息保存在服務端,key值是隨機產生的自符串,value值時session的內容 # 依賴於cookie將每個用戶的隨機字符串保存到用戶瀏覽器上 #Django中session默認保存在數據庫中:django_session表 #flask,session默認將加密的數據寫在用戶的cookie中
19. 列舉django orm 中所有的方法(QuerySet對象的所有方法)
#<1> all(): 查詢所有結果 #<2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象。獲取不到返回None #<3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個。獲取不到會抱胸 #如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。 #<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象 #<5> order_by(*field): 對查詢結果排序 #<6> reverse(): 對查詢結果反向排序 #<8> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。 #<9> first(): 返回第一條記錄 #<10> last(): 返回最后一條記錄 #<11> exists(): 如果QuerySet包含數據,就返回True,否則返回False #<12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的並不是一系 model的實例化對象,而是一個可迭代的字典序列 #<13> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 #<14> distinct(): 從返回結果中剔除重復紀錄
20. only和defer的區別?
#only:從數據庫中只取指定字段的內容 #defer:指定字段的內容不被檢索
21. select_related和prefetch_related的區別?
#有外鍵存在時,可以很好的減少數據庫請求的次數,提高性能 #select_related通過多表join關聯查詢,一次性獲得所有數據,只執行一次SQL查詢 #prefetch_related分別查詢每個表,然后根據它們之間的關系進行處理,執行兩次查詢
22. filter和exclude的區別?
#取到的值都是QuerySet對象,filter選擇滿足條件的,exclude:排除滿足條件的.
23. F和Q的作用?
#F:對數據本身的不同字段進行操作 如:比較和更新 #Q:用於構造復雜的查詢條件 如:& |操作
24. values和values_list的區別?
#values : 取字典的queryset #values_list : 取元組的queryset
25. 如何使用django orm批量創建數據?
#bulk_create() #objs=[models.Book(title="圖書{}".format(i+15)) for i in range(100)] #models.Book.objects.bulk_create(objs)
26. django的Form和ModeForm的作用?
#Form作用: # 1.在前端生成HTML代碼 # 2.對數據作有效性校驗 # 3.返回校驗信息並展示 #ModeForm:根據模型類生成From組件,並且可以操作數據庫
27. django的Form組件中,如果字段中包含choices參數,請使用兩種方式實現數據源實時更新。
#1.重寫構造函數 def def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name") #2.利用ModelChoiceField字段,參數為queryset對象
28. django的Model中的ForeignKey字段中的on_delete參數有什么作用?
#刪除關聯表中的數據時,當前表與其關聯的field的操作 #django2.0之后,表與表之間關聯的時候,必須要寫on_delete參數,否則會報異常
29. django如何實現websocket?
# 列舉django orm中三種能寫sql語句的方法。
#1.使用execute執行自定義的SQL #2.使用extra方法 #3.使用raw方法 # 1.執行原始sql並返回模型 # 2.依賴model多用於查詢
30. django orm 中如何設置讀寫分離?
#1.手動讀寫分離:通過.using(db_name)來指定要使用的數據庫 #2.自動讀寫分離: # 1.定義類:如Router # 2.配置Router # settings.py中指定DATABASE_ROUTERS # DATABASE_ROUTERS = ['myrouter.Router',] #提高讀的性能:多配置幾個數據庫,並在讀取時,隨機選取。寫的時候寫到主庫 #實現app之間的數據庫分離:分庫分表
31. django中如何實現orm表中添加數據時創建一條日志記錄。
32. django內置的緩存機制?
# 全站緩存 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 %}
33. django的緩存能使用redis嗎?如果可以的話,如何配置?
#1.安裝 pip install django-redis #2.在stting中配置CACHES,可以設置多個緩存,根據名字使用 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密碼", } } }, #另添加緩存 "JERD": { } #3.根據名字去連接池中獲取連接 from django_redis import get_redis_connection conn = get_redis_connection("default")
34. django的模板中filter和simple_tag的區別?
# 自定義filter:{{ 參數1|filter函數名:參數2 }} # 1.可以與if標簽來連用 # 2.自定義時需要寫兩個形參 # simple_tag:{% simple_tag函數名 參數1 參數2 %} # 1.可以傳多個參數,沒有限制 # 2.不能與if標簽來連用
35. django-debug-toolbar的作用?
#1.是django的第三方工具包,給django擴展了調試功能 #包括查看sql語句,db查詢次數,request,headers等
36. django中如何實現單元測試?
37. 解釋orm中 db first 和 code first的含義?
#數據持久化的方式: #db first基於已存在的數據庫,生成模型 #code first基於已存在的模型,生成數據庫庫
38. django中如何根據數據庫表生成model中的類?
#1.在settings中設置要連接的數據庫 #2.生成model模型文件 #python manage.py inspectdb #3.模型文件導入到models中 # python manage.py inspectdb > app/models.py
39. 使用orm和原生sql的優缺點?
#1.orm的開發速度快,操作簡單。使開發更加對象化 #執行速度慢。處理多表聯查等復雜操作時,ORM的語法會變得復雜 #2.sql開發速度慢,執行速度快。性能強
40. django的contenttype組件的作用?
#這個組件保存了項目中所有app和model的對應關系,每當我們創建了新的model並執行數據庫遷移后,ContentType表中就會自動新增一條記錄 #當一張表和多個表FK關聯,並且多個FK中只能選擇其中一個或其中n個時,可以利用contenttypes
41. 談談你對restful規范的認識?
#首先restful是一種軟件架構風格或者說是一種設計風格,並不是標准,它只是提供了一組設計#原則和約束條件,主要用於客戶端和服務器交互類的軟件。 #就像設計模式一樣,並不是一定要遵循這些原則,而是基於這個風格設計的軟件可以更簡潔,更#有層次,我們可以根據開發的實際情況,做相應的改變。 #它里面提到了一些規范,例如: #1.restful 提倡面向資源編程,在url接口中盡量要使用名詞,不要使用動詞 #2、在url接口中推薦使用Https協議,讓網絡接口更加安全 #https://www.bootcss.com/v1/mycss?page=3 #(Https是Http的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL, #因此加密的詳細內容就需要SSL(安全套接層協議)) #3、在url中可以體現版本號 #https://v1.bootcss.com/mycss #不同的版本可以有不同的接口,使其更加簡潔,清晰 #4、url中可以體現是否是API接口 #https://www.bootcss.com/api/mycss #5、url中可以添加條件去篩選匹配 #https://www.bootcss.com/v1/mycss?page=3 #6、可以根據Http不同的method,進行不同的資源操作 #(5種方法:GET / POST / PUT / DELETE / PATCH) #7、響應式應該設置狀態碼 #8、有返回值,而且格式為統一的json格式 #9、返回錯誤信息 #返回值攜帶錯誤信息 #10、返回結果中要提供幫助鏈接,即API最好做到Hypermedia #如果遇到需要跳轉的情況 攜帶調轉接口的URL ret = { code: 1000, data:{ id:1, name:'小強', depart_id:http://www.luffycity.com/api/v1/depart/8/ } }
42. 接口的冪等性是什么意思?
#1.是系統的接口對外一種承諾(而不是實現) #2.承諾只要調用接口成功,外部多次調用對系統的影響都是一致的,不會對資源重復操作
43. 什么是RPC?
#遠程過程調用 (RPC) 是一種協議,程序可使用這種協議向網絡中的另一台計算機上的程序請求服務 #1.RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。 #2.首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。 #2.在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息, #3.最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
44. 為什么要使用API
#系統之間為了調用數據。 #數據傳輸格式: # 1.json # 2.xml
45. 為什么要使用django rest framework框架?
#能自動生成符合 RESTful 規范的 API #1.在開發REST API的視圖中,雖然每個視圖具體操作的數據不同, #但增、刪、改、查的實現流程基本一樣,這部分的代碼可以簡寫 #2.在序列化與反序列化時,雖然操作的數據不同,但是執行的過程卻相似,這部分的代碼也可以簡寫 #REST framework可以幫助簡化上述兩部分的代碼編寫,大大提高REST API的開發速度
46. django rest framework框架中都有那些組件?
#1.序列化組件:serializers 對queryset序列化以及對請求數據格式校驗 #2.路由組件routers 進行路由分發 #3.視圖組件ModelViewSet 幫助開發者提供了一些類,並在類中提供了多個方法 #4.認證組件 寫一個類並注冊到認證類(authentication_classes),在類的的authticate方法中編寫認證邏 #5.權限組件 寫一個類並注冊到權限類(permission_classes),在類的的has_permission方法中編寫認證邏輯。 #6.頻率限制 寫一個類並注冊到頻率類(throttle_classes),在類的的allow_request/wait 方法中編寫認證邏輯 #7.解析器 選擇對數據解析的類,在解析器類中注冊(parser_classes) #8.渲染器 定義數據如何渲染到到頁面上,在渲染器類中注冊(renderer_classes) #9.分頁 對獲取到的數據進行分頁處理, pagination_class #10.版本 版本控制用來在不同的客戶端使用不同的行為 #在url中設置version參數,用戶請求時候傳入參數。在request.version中獲取版本,根據版本不同 做不同處理
47. django rest framework框架中的視圖都可以繼承哪些類?
#class View(object): #class APIView(View): 封裝了view,並且重新封裝了request,初始化了各種組件 #class GenericAPIView(views.APIView): #1.增加了一些屬性和方法,如get_queryset,get_serializer #class GenericViewSet(ViewSetMixin, generics.GenericAPIView) #父類ViewSetMixin 重寫了as_view,返回return csrf_exempt(view) #並重新設置請求方式與執行函數的關系 #class ModelViewSet(mixins.CreateModelMixin, # mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # mixins.ListModelMixin, # GenericViewSet):pass #繼承了mixins下的一些類,封裝了list,create,update等方法 #和GenericViewSet
48. 簡述 django rest framework框架的認證流程
#1.用戶請求走進來后,走APIView,初始化了默認的認證方法 #2.走到APIView的dispatch方法,initial方法調用了request.user #3.如果我們配置了認證類,走我們自己認證類中的authentication方法
49. django rest framework如何實現的用戶訪問頻率控制
#使用IP/用戶賬號作為鍵,每次的訪問時間戳作為值,構造一個字典形式的數據,存起來,每次訪問時對時間戳列表的元素進行判斷, #把超時的刪掉,再計算列表剩余的元素數就能做到頻率限制了 #匿名用戶:使用IP控制,但是無法完全控制,因為用戶可以換代理IP登錄用戶:使用賬號控制,但是如果有很多賬號,也無法限制
50. rest_framework序列化組件的作用,以及一些外鍵關系的鈎子方法
#作用:幫助我們序列化數據 #1.choices get_字段名_display #2.ForeignKey source=orm 操作 #3.ManyToManyFiled SerializerMethodField() # def get_字段名(): # return 自定義
51. 給用戶提供一個接口之前需要提前做什么
#1.跟前端進行和交互,確定前端要什么 #2.把需求寫個文檔保存
52. PV和UV
#1.pv:頁面訪問量,沒打開一次頁面PV計算+1,頁面刷新也是 #2.UV:獨立訪問數,一台電腦終端為一個訪客
53. 什么是跨域以及解決方法:
#跨域: # 瀏覽器從一個域名的網頁去請求另一個域名的資源時,瀏覽器處於安全的考慮,不允許不同源的請求 #同源策略: # 協議相同 # 域名相同 # 端口相同 #處理方法: # 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頭的處理
54. 如何實現用戶的登陸認證
#1.cookie session #2.token 登陸成功后生成加密字符串 #3.JWT:json wed token縮寫 它將用戶信息加密到token中,服務器不保存任何用戶信息 #服務器通過使用保存的密鑰來驗證token的正確性
55. 如何將dict轉換成url的格式:
#使用urlencode #from urllib.parse import urlencode #post_data={"k1":"v1","k2":"v2"} #ret=urlencode(post_data) #print(ret,type(ret)) #k1=v1&k2=v2 <class 'str'>