【2018】Python面試題【web框架】

一、談談你對http協議的認識。
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。端口號爲80
 
二、談談你對websocket協議的認識。
WebSocket是HTML5開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議。
在WebSocket API中,瀏覽器和服務器只須要作一個握手的動做,而後,瀏覽器和服務器之間就造成了一條快速通道。二者之間就直接能夠數據互相傳送。
瀏覽器經過 JavaScript 向服務器發出創建 WebSocket 鏈接的請求,鏈接創建之後,客戶端和服務器端就能夠經過 TCP 鏈接直接交換數據。
 
三、什麼是magic string ?
有觸發時機在知足條件時自動觸發就是魔術方法
 
四、如何建立響應式佈局?
使用媒體查詢的方式,建立多個元素寬度是相對的的佈局理想的響應式佈局是指的對PC/移動各類終端進行響應的
 
五、你曾經使用過哪些前端框架?
Bootstrap / vue
 
六、什麼是ajax請求?並使用jQuery和對象實現一個ajax請求。
AJAX是在不加載整個頁面的狀況異步下與服務器發送請求交換數據並更新部分網頁的藝術
 1 $.ajax({
 2     url:'user/add',//當前請求的url地址
 3     type:'get',//當前請求的方式 get post
 4     data:{id:100},//請求時發送的參數
 5     dataType:'json',//返回的數據類型
 6     success:function(data){
 7         //ajax請求成功後執行的代碼
 8         console.log(data);
 9     },
10     error:function(){
11         //ajax執行失敗後執行的代碼
12         alert('ajax執行錯誤');
13     },
14     timeout:2000,//設置當前請求的超時時間 異步請求生效
15     async:true //是否異步 false同步 true異步
16 })

 

七、如何在前端實現輪訓?
特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP request,而後由服務器返回最新的數據給客戶端的瀏覽器。
 
八、如何在前端實現長輪訓?
ajax實現:在發送ajax後,服務器端會阻塞請求直到有數據傳遞或超時纔會返回,客戶端js響應處理函數會在處理完服務器返回的信息後在次發出請求,從新創建鏈接
 
九、vuex的做用?
Vue 的目標是經過儘量簡單的 API 實現響應的數據綁定和組合的視圖組件。
 
十、vue中的路由的攔截器的做用?
判斷每個頁面的http請求的狀態獲取內容作響應的處理
 
十一、axios的做用?

在瀏覽器中發送 XMLHttpRequests 請求
在 node.js 中發送 http請求
支持 Promise API
攔截請求和響應
轉換請求和響應數據
自動轉換 JSON 數據
客戶端支持保護安全免受 XSRF 攻擊
 

十二、列舉vue的常見指令。

條件判斷使用 v-if指令
循環使用 v-for 指令。
事件監聽可使用 v-on 指令:
 

1三、簡述jsonp及實現原理?
JSONP是用來解決跨域請求問題的
跨域:協議 域名 端口號有一個不同就是跨域
實現原理:
script標籤src屬性中的連接卻能夠訪問跨域的js腳本,利用這個特性,服務端再也不返回JSON格式的數據,而是返回一段調用某個函數的js代碼,在src中進行了調用,這樣實現了跨域。
 
1四、什麼是cors ?
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 AJAX 跨域請求資源的方式,支持現代瀏覽器,IE支持10以上。
 
1五、列舉Http請求中常見的請求方式?
GET / POST
 
1六、列舉Http請求中的狀態碼?
404 請求的url地址不存在
503 訪問限制有權限
200 訪問成功
302 重定向
 
1七、列舉Http請求中常見的請求頭?

User-Agent:瀏覽器類型,若是Servlet返回的內容與瀏覽器類型有關則該值很是有用。
Cookie:這是最重要的請求頭信息之一
Content-Type:請求類型
 
2四、django、flask、tornado框架的比較?
Django:Python 界最全能的 web 開發框架,battery-include 各類功能完備,可維護性和開發速度一級棒。常有人說 Django 慢,其實主要慢在 Django ORM 與數據庫的交互上,因此是否選用 Django,取決於項目對數據庫交互的要求以及各類優化。而對於 Django 的同步特性致使吞吐量小的問題,其實能夠經過 Celery 等解決,倒不是一個根本問題。Django 的項目表明:Instagram,Guardian。
Tornado:天生異步,性能強悍是 Tornado 的名片,然而 Tornado 相比 Django 是較爲原始的框架,諸多內容須要本身去處理。固然,隨着項目愈來愈大,框架可以提供的功能佔比愈來愈小,更多的內容須要團隊本身去實現,而大項目每每須要性能的保證,這時候 Tornado 就是比較好的選擇。Tornado項目表明:知乎。
Flask:微框架的典範,號稱 Python 代碼寫得最好的項目之一。Flask 的靈活性,也是雙刃劍:能用好 Flask 的,能夠作成 Pinterest,用很差就是災難(顯然對任何框架都是這樣)。Flask 雖然是微框架,可是也能夠作成規模化的 Flask。加上 Flask 能夠自由選擇本身的數據庫交互組件(一般是 Flask-SQLAlchemy),並且加上 celery +redis 等異步特性之後,Flask 的性能相對 Tornado 也不逞多讓,也許Flask 的靈活性多是某些團隊更須要的。
 
2五、什麼是wsgi?

WSGI(Web Server Gateway Interface,Web 服務器網關接口)則是Python語言中1所定義的Web服務器和Web應用程序之間或框架之間的通用接口標準。
WSGI就是一座橋樑,橋樑的一端稱爲服務端或網關端,另外一端稱爲應用端或者框架端,WSGI的做用就是在協議之間進行轉化。WSGI將Web組件分紅了三類:Web 服務器(WSGI Server)、Web中間件(WSGI Middleware)與Web應用程序(WSGI Application)。
Web Server接收HTTP請求,封裝一系列環境變量,按照WSGI接口標準調用註冊的WSGI Application,最後將響應返回給客戶端。
 

2六、django請求的生命週期?
前端請求—>nginx—>uwsgi.—>中間件—>url路由—->view試圖—>orm—->拿到數據返回給view—->試圖將數據渲染到模版中拿到字符串—->中間件—>uwsgi—->nginx—->前端渲染
 
2七、列舉django的內置組件?
url 、view、model、template、中間件
 
2八、列舉django中間件的5個方法?以及django中間件的應用場景?

process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
 

2九、簡述什麼是FBV和CBV?
django中請求處理方式有2種:FBV 和 CBV
FBV(function base views) 就是在視圖裏使用函數處理請求。
CBV(class base views)就是在視圖裏使用類處理請求 類須要繼承view
 
30、django的request對象是在何時建立的?
當請求一個頁面時,Django會創建一個包含請求元數據的 HttpRequest 對象。 當Django 加載對應的視圖時,HttpRequest 對象將做爲視圖函數的第一個參數。每一個視圖會返回一個HttpResponse 對象。
 
3一、如何給CBV的程序添加裝飾器?
 
 1   from django.views import View
 2   from django.utils.decorators import method_decorator
 3 
 4   def auth(func):
 5       def inner(*args,**kwargs):
 6           return func(*args,**kwargs)
 7       return inner
 8 
 9   class UserView(View):                       
10       @method_decorator(auth)
11       def get(self,request,*args,**kwargs):
12           return HttpResponse('...')

 

  from django.views import View
  from django.utils.decorators import method_decorator
  def auth(func):
      def inner(*args,**kwargs):
          return func(*args,**kwargs)
      return inner
  class UserView(View):                      
      @method_decorator(auth)
      def get(self,request,*args,**kwargs):
          return HttpResponse('...')123456789101112
 
3二、列舉django orm 中全部的方法(QuerySet對象的全部方法)
返回Query Set對象的方法有:
* all()
* filter()
* exclude()
* order_by()
* reverse()
* dictinct()
特殊的QuerySet:
* values()  返回一個可迭代的字典序列
* values_list() 返回一個可迭代的元祖序列
返回具體對象的:
* get()
* first()
* last()
返回布爾值的方法有:
* existe()
返回數學的方法有:
* count( )
 
3三、only和defer的區別?

defer : 映射中排除某列數據
only : 僅取某個列中的數據
 

3四、select_related和prefetch_related的區別?

select_related經過多表join關聯查詢,一次性得到全部數據,經過下降數據庫查詢次數來提高性能,但關聯表不能太多,由於join操做原本就比較消耗性能
prefetch_related()的解決方法是,分別查詢每一個表,而後用Python處理他們之間的關係!
都是爲了減小SQL查詢的數量
 

3五、filter和exclude的區別?
filter是查詢知足條件的數據
exclude是查詢不知足添加的數據
 
3六、列舉django orm中三種能寫sql語句的方法。
 
#  1.使用execute執行自定義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方法
#     解釋:執行原始sql並返回模型
#     說明:依賴model多用於查詢
#     用法:
#       book = Book.objects.raw("select * from hello_book")
#       for item in book:
#         print(item.title)123456789101112131415161718192021
 
3七、django orm 中如何設置讀寫分離?
 
 1 class Router1:
 2       def allow_migrate(self, db, app_label, model_name=None, **hints):
 3           """
 4           All non-auth models end up in this pool.
 5           """
 6           if db=='db1' and app_label == 'app02':
 7               return True
 8           elif db == 'default' and app_label == 'app01':
 9               return True
10           else:
11               return False
12 
13           # 若是返回None,那麼表示交給後續的router,若是後續沒有router,則至關於返回True
14 
15       def db_for_read(self, model, **hints):
16           """
17           Attempts to read auth models go to auth_db.
18           """
19           if model._meta.app_label == 'app01':
20               return 'default'
21           else:
22               return 'db1'
23 
24       def db_for_write(self, model, **hints):
25           """
26           Attempts to write auth models go to auth_db.
27           """
28           if model._meta.app_label == 'app01':
29               return 'default'
30           else:
31               return 'db1'

 

 
3八、F和Q的做用?
F:操做數據表中的某列值,F( )容許Django在未實際連接數據的狀況下具備對數據庫字段的值的引用,不用獲取對象放在內存中再對字段進行操做,直接執行原生產sql語句操做。
一般狀況下咱們在更新數據時須要先從數據庫裏將原數據取出後方在內存裏,而後編輯某些屬性,最後提交
Q:對對象進行復雜查詢,並支持&(and),|(or),~(not)操做符。
 
3九、values和values_list的區別?

values方法能夠獲取number字段的字典列表。
values_list能夠獲取number的元組列表。
values_list方法加個參數flat=True能夠獲取number的值列表。
 

40、如何使用django orm批量建立數據?
 
1   def bulk_create(self, objs, batch_size=None):
2         # 批量插入
3         # batch_size表示一次插入的個數
4         objs = [
5             models.DDD(name='r11'),
6             models.DDD(name='r22')
7         ]
8         models.DDD.objects.bulk_create(objs, 10)

 

4一、django的Form和ModeForm的做用?html

 
 1 - 做用:
 2       - 對用戶請求數據格式進行校驗
 3       - 自動生成HTML標籤
 4   - 區別:
 5       - Form,字段須要本身手寫。
 6           class Form(Form):
 7               xx = fields.CharField(.)
 8               xx = fields.CharField(.)
 9               xx = fields.CharField(.)
10               xx = fields.CharField(.)
11       - ModelForm,能夠經過Meta進行定義
12           class MForm(ModelForm):
13               class Meta:
14                   fields = "__all__"
15                   model = UserInfo                            
16   - 應用:只要是客戶端向服務端發送表單數據時,均可以進行使用,如:用戶登陸註冊

 

 
4二、django的Form組件中,若是字段中包含choices參數,請使用兩種方式實現數據源實時更新。
 
 1 方式一:重寫構造方法,在構造方法中從新去數據庫獲取值
 2   class UserForm(Form):
 3       name = fields.CharField(label='用戶名',max_length=32)
 4       email = fields.EmailField(label='郵箱')
 5       ut_id = fields.ChoiceField(
 6           # choices=[(1,'二B用戶'),(2,'山炮用戶')]
 7           choices=[]
 8       )
 9       def __init__(self,*args,**kwargs):
10           super(UserForm,self).__init__(*args,**kwargs)
11           self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title')
12   方式二: ModelChoiceField字段
13   from django.forms import Form
14   from django.forms import fields
15   from django.forms.models import ModelChoiceField
16   class UserForm(Form):
17       name = fields.CharField(label='用戶名',max_length=32)
18       email = fields.EmailField(label='郵箱')
19       ut_id = ModelChoiceField(queryset=models.UserType.objects.all())    
20   依賴:
21       class UserType(models.Model):
22           title = models.CharField(max_length=32)
23           def __str__(self):
24               return self.title

 

 4三、django的Model中的ForeignKey字段中的on_delete參數有什麼做用?
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個可選擇的值
CASCADE:此值設置,是級聯刪除。
PROTECT:此值設置,是會報完整性錯誤。
SET_NULL:此值設置,會把外鍵設置爲null,前提是容許爲null。
SET_DEFAULT:此值設置,會把設置爲外鍵的默認值。
SET():此值設置,會調用外面的值,能夠是一個函數。
 
4四、django中csrf的實現機制?
Django預防CSRF攻擊的方法是在用戶提交的表單中加入一個csrftoken的隱含值,這個值和服務器中保存的csrftoken的值相同,這樣作的原理以下:
一、在用戶訪問django的可信站點時,django反饋給用戶的表單中有一個隱含字段csrftoken,這個值是在服務器端隨機生成的,每一次提交表單都會生成不一樣的值
二、當用戶提交django的表單時,服務器校驗這個表單的csrftoken是否和本身保存的一致,來判斷用戶的合法性
三、當用戶被csrf攻擊從其餘站點發送精心編制的攻擊請求時,因爲其餘站點不可能知道隱藏的csrftoken字段的信息這樣在服務器端就會校驗失敗,攻擊被成功防護
具體配置以下:
template中添加{%csrf_token%}標籤
 
4五、django如何實現websocket?
利用dwebsocket在Django中使用Websocket
http://www.javashuo.com/article/p-hlamxgwt-e.html
 
4六、基於django使用ajax發送post請求時,均可以使用哪一種方法攜帶csrf token?
 
4七、django中如何實現orm表中添加數據時建立一條日誌記錄。
 
 1 在settings.py中添加:
 2 LOGGING = {
 3     'disable_existing_loggers': False,
 4     'version': 1,
 5     'handlers': {
 6         'console': {
 7             # logging handler that outputs log messages to terminal
 8             'class': 'logging.StreamHandler',
 9             'level': 'DEBUG', # message level to be written to console
10         },
11     },
12     'loggers': {
13         '': {
14             # this sets root level logger to log debug and higher level
15             # logs to console. All other loggers inherit settings from
16             # root level logger.
17             'handlers': ['console'],
18             'level': 'DEBUG',
19             'propagate': False, # this tells logger to send logging message
20                                 # to its parent (will send if set to True)
21         },
22         'django.db': {
23             # # django also has database level logging
24             'handlers': ['console'],
25             'level': 'DEBUG',
26             'propagate': False,
27         },
28     },
29 }

 

 4八、django緩存如何設置?
 
 1 三種粒度緩存
 2    1 中間件級別
 3        'django.middleware.cache.UpdateCacheMiddleware',
 4        'django.middleware.cache.FetchFromCacheMiddleware',
 5         CACHE_MIDDLEWARE_SECONDS=10
 6    2 視圖級別
 7       from django.views.decorators.cache import cache_page
 8       @cache_page(15)
 9       def index(request):
10           import time
11           t=time.time()
12           return render(request,"index.html",locals())
13 
14    3 局部緩存
15       {% load cache %}
16           ...
17           ...
18       {% cache 15 "time_cache" %}
19       <h3>緩存時間:{{ t }}</h3>
20       {% endcache %}

 

 
4九、django的緩存能使用redis嗎?若是能夠的話,如何配置?
 
 1   pip install django-redis  
 2   apt-get install redis-server
 3   而後在settings.py 裏面添加CACHES = {
 4   'default': {
 5   'BACKEND': 'redis_cache.cache.RedisCache',
 6   'LOCATION': '127.0.0.1:6379',
 7   "OPTIONS": {
 8   "CLIENT_CLASS": "redis_cache.client.DefaultClient",
 9   },
10   }


50、django路由系統中name的做用?前端

name 能夠用於在 templates, models, views ……中獲得對應的網址,至關於「給網址取了個小名」,只要這個名字不變,網址變了也能經過名字獲取到。
 
5一、django的模板中filter和simple_tag的區別?
simple_tag 
    -參數任意,可是不能做爲if條件判斷的條件
  filter 
    -參數最多隻能有兩個,可是能夠做爲if條件判斷的條件。
 
5二、django-debug-toolbar的做用?
django_debug_toolbar 是django的第三方工具包,給django擴展了調試功能。 
包括查看執行的sql語句,db查詢次數,request,headers,調試概覽等。 
https://blog.csdn.net/weixin_39198406/article/details/78821677
 
5三、django中如何實現單元測試?
 
5四、解釋orm中 db first 和 code first的含義?
datebase  first就是表明數據庫優先,那麼前提就是先建立數據庫。
  model first就是表明model優先,那麼前提也就是先建立model,而後根據model自動創建數據庫。
 
5五、django中如何根據數據庫表生成model中的類?
 
5六、使用orm和原生sql的優缺點?
ORM框架:
  對象關係映射,經過建立一個類,這個類與數據庫的表相對應!類的對象代指數據庫中的一行數據。
簡述ORM原理:
  讓用戶再也不寫SQL語句,而是經過類以及對象的方式,和其內部提供的方法,進行數據庫操做!把用戶輸入的類或對象轉換成SQL語句,轉換以後經過pymysql執行完成數據庫的操做。
ORM的優缺點:
優勢: 
  * 提升開發效率,下降開發成本 
  * 使開發更加對象化 
  * 可移植 
  * 能夠很方便地引入數據緩存之類的附加功能
缺點: 
  * 在處理多表聯查、where條件複雜之類的查詢時,ORM的語法會變得複雜。就須要寫入原生SQL。
 
5七、簡述MVC和MTV
MTV和MVC?
MVC: 模型 視圖 控制器
  MTV: 模型  模板 視圖  
 
5八、django的contenttype組件的做用?
django內置的ContentType組件就是幫咱們作連表操做
若是一個表與其餘表有多個外鍵關係,咱們能夠經過ContentType來解決這種關聯
http://www.cnblogs.com/iyouyue/p/8810464.html
 
59. 談談你對restfull 規範的認識?

restful其實就是一套編寫接口的協議,協議規定如何編寫以及如何設置返回值、狀態碼等信息。
最顯著的特色:
restful: 給用戶一個url,根據method不一樣在後端作不一樣的處理,好比:post 建立數據、get獲取數據、put和patch修改數據、delete刪除數據。
no rest: 給調用者不少url,每一個url表明一個功能,好比:add_user/delte_user/edit_user/
固然,還有協議其餘的,好比:
版本,來控制讓程序有多個版本共存的狀況,版本能夠放在 url、請求頭(accept/自定義)、GET參數
狀態碼,200/300/400/500
url中儘可能使用名詞,restful也能夠稱爲「面向資源編程」
api標示:
api.YueNet.com
www.YueNet.com/api/
 

60、接口的冪等性是什麼意思?
一個接口經過首先進行1次訪問,而後對該接口進行N次相同訪問的時候,對訪問對象不形成影響,那麼就認爲接口具備冪等性。
  好比:
*  GET,  第一次獲取數據、第二次也是獲取結果,冪等。
* POST, 第一次新增數據,第二次也會再次新增,非冪等。
* PUT,  第一次更新數據,第二次不會再次更新,冪等。
* PATCH,第一次更新數據,第二次可能再次更新,非冪等。
* DELTE,第一次刪除數據,第二次不會再次刪除,冪等。
 
6一、什麼是RPC?
RPC(Remote Procedure Call)—遠程過程調用,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。
 
62. Http和Https的區別?
  超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就能夠直接讀懂其中的信息,所以,HTTP協議不適合傳輸一些敏感信息,好比:信用卡號、密碼等支付信息。
  爲了解決HTTP協議的這一缺陷,須要使用另外一種協議:安全套接字層超文本傳輸協議HTTPS,爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。
 
6三、爲何要使用django rest framework框架?
1.客戶端-服務端分離
優勢:提升用戶界面的便攜性,經過簡化服務器提升可伸縮性….
2.無狀態(Stateless):從客戶端的每一個請求要包含服務器所須要的全部信息
優勢:提升可見性(能夠單獨考慮每一個請求),提升了可靠性(更容易從局部故障中修復),提升可擴展性(下降了服務器資源使用)
3.緩存(Cachable):服務器返回信息必須被標記是否能夠緩存,若是緩存,客戶端可能會重用以前的信息發送請求
優勢:減小交互次數,減小交互的平均延遲
4.統一接口
優勢:提升交互的可見性,鼓勵單獨改善組件
5.支持按需代碼(Code-On-Demand 可選)
優勢:提升可擴展性
 
6四、django rest framework框架中都有那些組件?
 
 1 - 路由,自動幫助開發者快速爲一個視圖建立4個url
 2             www.oldboyedu.com/api/v1/student/$
 3             www.oldboyedu.com/api/v1/student(?P<format>\w+)$    
 4             www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
 5             www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
 6     - 版本處理
 7         - 問題:版本均可以放在那裏?
 8                 - url
 9                 - GET 
10                 - 請求頭 
11     - 認證 
12         - 問題:認證流程?
13     - 權限 
14         - 權限是否能夠放在中間件中?以及爲何?
15     - 訪問頻率的控制
16         - 匿名用戶能夠真正的防止?沒法作到真正的訪問頻率控制,只能把小白拒之門外。
17           若是要封IP,使用防火牆來作。
18         - 登陸用戶能夠經過用戶名做爲惟一標示進行控制,若是有人註冊不少帳號,也沒法防止。
19     - 視圖
20     - 解析器 ,根據Content-Type請求頭對請求體中的數據格式進行處理。request.data 
21     - 分頁
22     - 序列化
23         - 序列化
24             - source
25             - 定義方法
26         - 請求數據格式校驗
27     - 渲染器
28  


6五、django rest framework框架中的視圖均可以繼承哪些類?vue

a. 繼承 APIView
1   這個類屬於rest framework中頂層類,內部幫助咱們實現了只是基本功能:認證、權限、頻率控制,但凡是數據庫、分頁等操做都須要手動去完成,比較原始。
2 
3  class GenericAPIView(APIView)
4       def post(...):
5           pass 

 

b. 繼承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
若是繼承它以後,路由中的as_view須要填寫對應關係    .as_view({‘get’:’list’,’post’:’create’})
在內部也幫助咱們提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer
1   注意:要設置queryset字段,不然會跑出斷言的異常。
2   # 只提供增長功能
3   class TestView(GenericViewSet):
4       serializer_class = XXXXXXX
5       def create(self,*args,**kwargs):
6           pass # 獲取數據並對數據進行操做

 

c. 繼承 
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
1   對數據庫和分頁等操做不用咱們在編寫,只須要繼承相關類便可。
2   示例:只提供增長功能
3   class TestView(mixins.CreateModelMixin,GenericViewSet):
4       serializer_class = XXXXXXX

 

 
6六、簡述 django rest framework框架的認證流程。

如何編寫?寫類並實現authticate
方法中能夠定義三種返回值:
(user,auth),認證成功
None , 匿名用戶
異常 ,認證失敗
流程:
dispatch
再去request中進行認證處理
 

6七、django rest framework如何實現的用戶訪問頻率控制?
a. 基於用戶IP限制訪問頻率
b. 基於用戶IP顯示訪問頻率(利於Django緩存) 
c. view中限制請求頻率
d. 匿名時用IP限制+登陸時用Token限制  
 
6八、Flask框架的優點?
1、總體設計方面
首先,二者都是很是優秀的框架。總體來說,二者設計的哲學是區別最大的地方。Django提供一站式的解決方案,從模板、ORM、Session、Authentication等等都分配好了,連app劃分都作好了,總之,爲你作儘可能多的事情,並且還有一個killer級的特性,就是它的admin,配合django-suit,後臺就出來了,其實最初Django就是由在新聞發佈公司工做的人設計的。Flask只提供了一些核心功能,很是簡潔優雅。它是一個微框架,其餘的由擴展提供,但它的blueprint使它也可以很方便的進行水平擴展。
2、路由設計
Django的路由設計是採用集中處理的方法,利用正則匹配。Flask也能這麼作,但更多的是使用裝飾器的形式,這個有優勢也有缺點,優勢是讀源碼時看到函數就知道怎麼用的,缺點是一旦源碼比較長,你要查路由就不太方便了,但這也促使你去思考如何更合理的安排代碼。
3、應用模塊化設計
Django的模塊化是集成在命令裏的,也就是說一開始Django的目標就是爲之後玩大了作準備的。每一個都是一個獨立的模塊,爲之後的複用提供了便利。Flask經過Blueprint來提供模塊化,本身對項目結構劃分紅不一樣的模塊進行組織。
 
6九、Flask框架依賴組件?

Route(路由)
templates(模板)
Models(orm模型)
blueprint(藍圖)
Jinja2模板引擎
 

70、Flask藍圖的做用?

將不一樣的功能模塊化
構建大型應用
優化項目結構
加強可讀性,易於維護(跟Django的view功能類似)
 

7一、列舉使用過的Flask第三方組件?
內置:
- 配置
    - 路由
    - 視圖
    - 模板
    - session
    - 閃現
    - 藍圖
    - 中間件
    - 特殊裝飾器
第三方:
- Flask組件:
    - flask-session 
    - flask-SQLAlchemy
    - flask-migrate 
    - flask-script 
    - blinker 
- 公共組件:
    - wtforms
    - dbutile
    - sqlalchemy 
- 自定義Flask組件
    - auth ,參考flask-login組件
 
7二、簡述Flask上下文管理流程?
每次有請求過來的時候,flask 會先建立當前線程或者進程須要處理的兩個重要上下文對象,把它們保存到隔離的棧裏面,這樣視圖函數進行處理的時候就能直接從棧上獲取這些信息。
 
7三、Flask中的g的做用?
g 至關於一次請求的全局變量,當請求進來時將g和current_app封裝爲一個APPContext類,在經過LocalStack將Appcontext放入Local中,取值時經過偏函數,LocalStack、loca l中取值,響應時將local中的g數據刪除
 
7四、Flask中上下文管理主要涉及到了那些相關的類?並描述類主要做用?

flask
requestcontext
request
securecookiesessioninterface
securecookiesession
 

7五、爲何要Flask把Local對象中的的值stack 維護成一個列表?
當是web應用時:無論是單線程仍是多線程,棧中只有一個數據
- 服務端單線程:
    {
    111:{stack: [ctx, ]}
    }
- 服務端多線程:
    {
    111:{stack: [ctx, ]}
    112:{stack: [ctx, ]}
    }
 
7六、Flask中多app應用是怎麼完成?
請求進來時,能夠根據URL的不一樣,交給不一樣的APP處理
 
7七、在Flask中實現WebSocket須要什麼組件?
Flask-SocketIO
Flask-Sockets是Flask框架的一個擴展,經過它,Flask應用程序可使用WebSocket。
 
7八、wtforms組件的做用?
WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。
https://www.cnblogs.com/big-handsome-guy/p/8552079.html
 
7九、Flask框架默認session處理機制?
Flask的默認session利用了Werkzeug的SecureCookie,把信息作序列化(pickle)後編碼(base64),放到cookie裏了。
過時時間是經過cookie的過時時間實現的。
爲了防止cookie內容被篡改,session會自動打上一個叫session的hash串,這個串是通過session內容、SECRET_KEY計算出來的,看得出,這種設計雖然不能保證session裏的內容不泄露,但至少防止了不被篡改。
 
80、解釋Flask框架中的Local對象和threading.local對象的區別?
a. threading.local 
    做用:爲每一個線程開闢一塊空間進行數據存儲。
 b. 自定義Local對象
    做用:爲每一個線程(協程)開闢一塊空間進行數據存儲。
    https://www.jianshu.com/p/3f38b777a621
 
8一、Flask中 blinker 是什麼?
Flask框架中的信號基於blinker,可讓開發者在flask請求過程當中 定製一些用戶行爲執行。
  在請求先後,模板渲染先後,上下文先後,異常 的時候
 
8二、SQLAlchemy中的 session和scoped_session 的區別?
使用scoped_session的目的主要是爲了線程安全。
  scoped_session相似單例模式,當咱們調用使用的時候,會先在Registry裏找找以前是否已經建立session了。
  要是有,就把這個session返回。
  要是沒有,就建立新的session,註冊到Registry中以便下次返回給調用者。
  這樣就實現了這樣一個目的:在同一個線程中,call scoped_session 的時候,返回的是同一個對象
 
8三、SQLAlchemy如何執行原生SQL?
 
1   from sqlalchemy import create_engine
2   from sqlalchemy.orm import sessionmaker
3   engine = create_engine('mysql://root:*****@127.0.0.1/database?charset=utf8')
4   DB_Session = sessionmaker(bind=engine)
5   session = DB_Session()
6   session.execute('alter table mytablename drop column mycolumn ;')


8四、ORM的實現原理?node

概念: 對象關係映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換。
詳細介紹:  讓咱們從O/R開始。字母O起源於」對象」(Object),而R則來自於」關係」(Relational)。幾乎全部的程序裏面,都存在對象和關係數據庫。在業務邏輯層和用戶界面層中,咱們是面向對象的。當對象信息發生變化的時候,咱們須要把對象的信息保存在關係數據庫中。
當你開發一個應用程序的時候(不使用O/R Mapping),你可能會寫很多數據訪問層的代碼,用來從數據庫保存,刪除,讀取對象信息,等等。你在DAL中寫了不少的方法來讀取對象數據,改變狀態對象等等任務。而這些代碼寫起來老是重複的。 
ORM解決的主要問題是對象關係的映射。域模型和關係模型分別是創建在概念模型的基礎上的。域模型是面向對象的,而關係模型是面向關係的。通常狀況下,一個持久化類和一個表對應,類的每一個實例對應表中的一條記錄,類的每一個屬性對應表的每一個字段。
ORM技術特色: 
* 提升了開發效率。因爲ORM能夠自動對Entity對象與數據庫中的Table進行字段與屬性的映射,因此咱們實際可能已經不須要一個專用的、龐大的數據訪問層。 
* ORM提供了對數據庫的映射,不用sql直接編碼,可以像操做對象同樣從數據庫獲取數據。
 
8五、DBUtils模塊的做用?
使用DBUtils模塊
兩種使用模式:
1. 爲每一個線程建立一個鏈接,鏈接不可控,須要控制線程數
1. 建立指定數量的鏈接在鏈接池,當線程訪問的時候去取,若是不夠了線程排隊,直到有人釋放。平時建議使用這種!
 
8六、如下SQLAlchemy的字段是否正確?若是不正確請更正:
 
 1 fromdatetime importdatetime
 2 fromsqlalchemy.ext.declarative
 3 importdeclarative_base
 4 fromsqlalchemy importColumn, Integer, String, DateTime
 5 Base = declarative_base()
 6 classUserInfo(Base):
 7     __tablename__ = 'userinfo'
 8     id = Column(Integer, primary_key= True, autoincrement= True)
 9     name = Column(String( 64), unique= True)
10     ctime = Column(DateTime, default=datetime.now())
11 ctime字段中的參數應該爲default=datetime.now, now後面不該該加括號.若是加了,字段不會隨時更新

 

8七、SQLAchemy中如何爲表設置引擎和字符編碼?
sqlalchemy設置編碼字符集必定要在數據庫訪問的URL上增長charset=utf8,不然數據庫的鏈接就不是utf8的編碼格式
  eng = create_engine(‘mysql://root:root@localhost:3306/test2?charset=utf8’,echo=True)
 
88. SQLAlchemy中如何設置聯合惟一索引?
UniqueConstraint 設置聯合惟一索引
 
8九、簡述Tornado框架的特色。
Tornado的獨特之處在於其全部開發工具可以使用在應用開發的任意階段以及任何檔次的硬件資源上。並且,完整集的Tornado工具可使開發人員徹底不用考慮與目標鏈接的策略或目標存儲區大小。
Tornado 結構的專門設計爲開發人員和第三方工具廠商提供了一個開放環境。已有部分應用程序接口能夠利用並附帶參考書目,內容從開發環境接口到鏈接實現。Tornado包括強大的開發和調試工具,尤爲適用於面對大量問題的嵌入式開發人員。這些工具包括C和C++源碼級別的調試器,目標和工具管理,系統目標跟蹤,內存使用分析和自動配置. 另外,全部工具能很方便地同時運行,很容易增長和交互式開發。
 
90、簡述Tornado框架中Future對象的做用?
 
91. Tornado框架中如何編寫WebSocket程序?
 
9二、Tornado中靜態文件是如何處理的?如:
處理方法:
static_path = os.path.join(os.paht.dirname(file), 「static」) #這裏增長設置了靜態路徑
  另一個修改就是在實例化 tornado.web.Application() 的時候,在參數中,出了有靜態路徑參數 static_path ,還有一個參數設置 debug=True
 
9三、Tornado操做MySQL使用的模塊?
torndb是一個輕量級的基於MySQLdb封裝的一個模塊,從tornado3.0版本之後,其已經做爲一個獨立模塊發行了。torndb依賴於MySQLdb模塊,所以,在使用torndb模塊時,要保證系統中已經有MySQLdb模塊。
 
9四、Tornado操做redis使用的模塊?
tornado-redis
 
9五、簡述Tornado框架的適用場景?
Tornado是使用Python編寫的一個強大的、可擴展的Web服務器。它在處理嚴峻的網絡流量時表現得足夠強健,但卻在建立和編寫時有着足夠的輕量級,並可以被用在大量的應用和工具中。
咱們如今所知道的Tornado是基於Bret Taylor和其餘人員爲FriendFeed所開發的網絡服務框架,當FriendFeed被Facebook收購後得以開源。不一樣於那些最多隻能達到10,000個併發鏈接的傳統網絡服務器,Tornado在設計之初就考慮到了性能因素,旨在解決C10K問題,這樣的設計使得其成爲一個擁有很是高性能的框架。此外,它還擁有處理安全性、用戶驗證、社交網絡以及與外部服務(如數據庫和網站API)進行異步交互的工具。 --------------------- 做者:愛python的王三金 來源:CSDN 原文:https://blog.csdn.net/qq_37275405/article/details/81226192 版權聲明:本文爲博主原創文章,轉載請附上博文連接!
相關文章
相關標籤/搜索