python之web面試題
1、談談你對http協議的認識。
HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。埠號為80
2、談談你對websocket協議的認識。
WebSocket是HTML5開始提供的一種在單個 TCP 連線上進行全雙工通訊的協議。
在WebSocket API中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。
瀏覽器通過 JavaScript 向伺服器發出建立 WebSocket 連線的請求,連線建立以後,客戶端和伺服器端就可以通過 TCP 連線直接交換資料。
3、什麼是magic string ?
有觸發時機在滿足條件時自動觸發就是魔術方法
4、如何建立響應式佈局?
使用媒體查詢的方式,建立多個元素寬度是相對的的佈局理想的響應式佈局是指的對PC/移動各種終端進行響應的
5、你曾經使用過哪些前端框架?
Bootstrap / vue
6、什麼是ajax請求?並使用jQuery和物件實現一個ajax請求。
AJAX是在不載入整個頁面的情況非同步下與伺服器傳送請求交換資料並更新部分網頁的藝術
$.ajax({ url:'user/add',//當前請求的url地址 type:'get',//當前請求的方式 get post data:{id:100},//請求時傳送的引數 dataType:'json',//返回的資料型別 success:function(data){ //ajax請求成功後執行的程式碼 console.log(data); }, error:function(){ //ajax執行失敗後執行的程式碼 alert('ajax執行錯誤'); }, timeout:2000,//設定當前請求的超時時間 非同步請求生效 async:true //是否非同步 false同步 true非同步 })
7、如何在前端實現輪訓?
特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的資料給客戶端的瀏覽器。
8、如何在前端實現長輪訓?
ajax實現:在傳送ajax後,伺服器端會阻塞請求直到有資料傳遞或超時才會返回,客戶端js響應處理函式會在處理完伺服器返回的資訊後在次發出請求,重新建立連線
9、vuex的作用?
Vue 的目標是通過儘可能簡單的 API 實現響應的資料繫結和組合的檢視元件。
10、vue中的路由的攔截器的作用?
判斷每一個頁面的http請求的狀態獲取內容做響應的處理
11、axios的作用?
- 在瀏覽器中傳送 XMLHttpRequests 請求
- 在 node.js 中傳送 http請求
- 支援 Promise API
- 攔截請求和響應
- 轉換請求和響應資料
- 自動轉換 JSON 資料
- 客戶端支援保護安全免受 XSRF 攻擊
12、列舉vue的常見指令。
- 條件判斷使用
v-if
指令 - 迴圈使用
v-for
指令。 - 事件監聽可以使用
v-on
指令:
13、簡述jsonp及實現原理?
JSONP是用來解決跨域請求問題的
跨域:協議 域名 埠號有一個不一樣就是跨域
實現原理:
script標籤src屬性中的連結卻可以訪問跨域的js指令碼,利用這個特性,服務端不再返回JSON格式的資料,而是返回一段呼叫某個函式的js程式碼,在src中進行了呼叫,這樣實現了跨域。
14、什麼是cors ?
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 AJAX 跨域請求資源的方式,支援現代瀏覽器,IE支援10以上。
15、列舉Http請求中常見的請求方式?
GET / POST
16、列舉Http請求中的狀態碼?
404 請求的url地址不存在
503 訪問限制有許可權
200 訪問成功
302 重定向
17、列舉Http請求中常見的請求頭?
- User-Agent:瀏覽器型別,如果Servlet返回的內容與瀏覽器型別有關則該值非常有用。
- Cookie:這是最重要的請求頭資訊之一
- Content-Type:請求型別
18、看圖寫結果:
alert(李傑)
19、看圖寫結果:
console.log(‘武沛齊’)
20、看圖寫結果:
console.log(‘老男孩’)
21、看圖寫結果:
結果什麼也沒有 因為console.log.的時候xo還沒有定義
22、看圖寫結果:
alert(”武沛齊’)
23、看圖寫結果:
alert(”武沛齊’)
24、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 的靈活性可能是某些團隊更需要的。
25、什麼是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,最後將響應返回給客戶端。
26、django請求的生命週期?
前端請求—>nginx—>uwsgi.—>中介軟體—>url路由—->view試圖—>orm—->拿到資料返回給view—->試圖將資料渲染到模版中拿到字串—->中介軟體—>uwsgi—->nginx—->前端渲染
27、列舉django的內建元件?
url 、view、model、template、中介軟體
28、列舉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)
29、簡述什麼是FBV和CBV?
django中請求處理方式有2種:FBV 和 CBV
FBV(function base views) 就是在視圖裡使用函式處理請求。
CBV(class base views)就是在視圖裡使用類處理請求 類需要繼承view
30、django的request物件是在什麼時候建立的?
當請求一個頁面時,Django會建立一個包含請求元資料的 HttpRequest 物件。 當Django 載入對應的檢視時,HttpRequest 物件將作為檢視函式的第一個引數。每個檢視會返回一個HttpResponse 物件。
31、如何給CBV的程式新增裝飾器?
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('...')
32、列舉django orm 中所有的方法(QuerySet物件的所有方法)
返回Query Set物件的方法有:
* all()
* filter()
* exclude()
* order_by()
* reverse()
* dictinct()
特殊的QuerySet:
* values() 返回一個可迭代的字典序列
* values_list() 返回一個可迭代的元祖序列
返回具體物件的:
* get()
* first()
* last()
返回布林值的方法有:
* existe()
返回數學的方法有:
* count( )
33、only和defer的區別?
- defer : 對映中排除某列資料
- only : 僅取某個列中的資料
34、select_related和prefetch_related的區別?
- select_related通過多表join關聯查詢,一次性獲得所有資料,通過降低資料庫查詢次數來提升效能,但關聯表不能太多,因為join操作本來就比較消耗效能
- prefetch_related()的解決方法是,分別查詢每個表,然後用Python處理他們之間的關係!
都是為了減少SQL查詢的數量
35、filter和exclude的區別?
filter是查詢滿足條件的資料
exclude是查詢不滿足新增的資料
36、列舉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)
37、django orm 中如何設定讀寫分離?
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,那麼表示交給後續的router,如果後續沒有router,則相當於返回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'
38、F和Q的作用?
F:操作資料表中的某列值,F( )允許Django在未實際連結資料的情況下具有對資料庫欄位的值的引用,不用獲取物件放在記憶體中再對欄位進行操作,直接執行原生產sql語句操作。
通常情況下我們在更新資料時需要先從資料庫裡將原資料取出後方在記憶體裡,然後編輯某些屬性,最後提交
Q:對物件進行復雜查詢,並支援&(and),|(or),~(not)操作符。
39、values和values_list的區別?
- values方法可以獲取number欄位的字典列表。
- values_list可以獲取number的元組列表。
- values_list方法加個引數flat=True可以獲取number的值列表。
40、如何使用django orm批量建立資料?
def bulk_create(self, objs, batch_size=None):
# 批量插入
# batch_size表示一次插入的個數
objs = [
models.DDD(name='r11'),
models.DDD(name='r22')
]
models.DDD.objects.bulk_create(objs, 10)
41、django的Form和ModeForm的作用?
- 作用:
- 對使用者請求資料格式進行校驗
- 自動生成HTML標籤
- 區別:
- Form,欄位需要自己手寫。
class Form(Form):
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
- ModelForm,可以通過Meta進行定義
class MForm(ModelForm):
class Meta:
fields = "__all__"
model = UserInfo
- 應用:只要是客戶端向服務端傳送表單資料時,都可以進行使用,如:使用者登入註冊
42、django的Form元件中,如果欄位中包含choices引數,請使用兩種方式實現資料來源實時更新。
方式一:重寫構造方法,在構造方法中重新去資料庫獲取值
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
43、django的Model中的ForeignKey欄位中的on_delete引數有什麼作用?
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個可選擇的值
CASCADE:此值設定,是級聯刪除。
PROTECT:此值設定,是會報完整性錯誤。
SET_NULL:此值設定,會把外來鍵設定為null,前提是允許為null。
SET_DEFAULT:此值設定,會把設定為外來鍵的預設值。
SET():此值設定,會呼叫外面的值,可以是一個函式。
44、django中csrf的實現機制?
Django預防CSRF攻擊的方法是在使用者提交的表單中加入一個csrftoken的隱含值,這個值和伺服器中儲存的csrftoken的值相同,這樣做的原理如下:
1、在使用者訪問django的可信站點時,django反饋給使用者的表單中有一個隱含欄位csrftoken,這個值是在伺服器端隨機生成的,每一次提交表單都會生成不同的值
2、當用戶提交django的表單時,伺服器校驗這個表單的csrftoken是否和自己儲存的一致,來判斷使用者的合法性
3、當用戶被csrf攻擊從其他站點發送精心編制的攻擊請求時,由於其他站點不可能知道隱藏的csrftoken欄位的資訊這樣在伺服器端就會校驗失敗,攻擊被成功防禦
具體配置如下:
template中新增{%csrf_token%}標籤
45、django如何實現websocket?
46、基於django使用ajax傳送post請求時,都可以使用哪種方法攜帶csrf token?
47、django中如何實現orm表中新增資料時建立一條日誌記錄。
在settings.py中新增:
LOGGING = {
'disable_existing_loggers': False,
'version': 1,
'handlers': {
'console': {
# logging handler that outputs log messages to terminal
'class': 'logging.StreamHandler',
'level': 'DEBUG', # message level to be written to console
},
},
'loggers': {
'': {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
'django.db': {
# # django also has database level logging
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False,
},
},
}
48、django快取如何設定?
三種粒度快取
1 中介軟體級別
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
CACHE_MIDDLEWARE_SECONDS=10
2 檢視級別
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>快取時間:{{ t }}</h3>
{% endcache %}
49、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",
},
}
50、django路由系統中name的作用?
name 可以用於在 templates, models, views ……中得到對應的網址,相當於“給網址取了個小名”,只要這個名字不變,網址變了也能通過名字獲取到。
51、django的模板中filter和simple_tag的區別?
simple_tag
-引數任意,但是不能作為if條件判斷的條件
filter
-引數最多隻能有兩個,但是可以作為if條件判斷的條件。
52、django-debug-toolbar的作用?
53、django中如何實現單元測試?
54、解釋orm中 db first 和 code first的含義?
datebase first就是代表資料庫優先,那麼前提就是先建立資料庫。
model first就是代表model優先,那麼前提也就是先建立model,然後根據model自動建立資料庫。
55、django中如何根據資料庫表生成model中的類?
56、使用orm和原生sql的優缺點?
ORM框架:
物件關係對映,通過建立一個類,這個類與資料庫的表相對應!類的物件代指資料庫中的一行資料。
簡述ORM原理:
讓使用者不再寫SQL語句,而是通過類以及物件的方式,和其內部提供的方法,進行資料庫操作!把使用者輸入的類或物件轉換成SQL語句,轉換之後通過pymysql執行完成資料庫的操作。
ORM的優缺點:
優點:
* 提高開發效率,降低開發成本
* 使開發更加物件化
* 可移植
* 可以很方便地引入資料快取之類的附加功能
缺點:
* 在處理多表聯查、where條件複雜之類的查詢時,ORM的語法會變得複雜。就需要寫入原生SQL。
57、簡述MVC和MTV
MTV和MVC?
MVC: 模型 檢視 控制器
MTV: 模型 模板 檢視
58、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,第一次刪除資料,第二次不會再次刪除,冪等。
61、什麼是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依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。
63、為什麼要使用django rest framework框架?
1.客戶端-服務端分離
優點:提高使用者介面的便攜性,通過簡化伺服器提高可伸縮性….
2.無狀態(Stateless):從客戶端的每個請求要包含伺服器所需要的所有資訊
優點:提高可見性(可以單獨考慮每個請求),提高了可靠性(更容易從區域性故障中修復),提高可擴充套件性(降低了伺服器資源使用)
3.快取(Cachable):伺服器返回資訊必須被標記是否可以快取,如果快取,客戶端可能會重用之前的資訊傳送請求
優點:減少互動次數,減少互動的平均延遲
4.統一介面
優點:提高互動的可見性,鼓勵單獨改善元件
5.支援按需程式碼(Code-On-Demand 可選)
優點:提高可擴充套件性
64、django rest framework框架中都有那些元件?
- 路由,自動幫助開發者快速為一個檢視建立4個url
www.oldboyedu.com/api/v1/student/$
www.oldboyedu.com/api/v1/student(?P<format>\w+)$
www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
- 版本處理
- 問題:版本都可以放在那裡?
- url
- GET
- 請求頭
- 認證
- 問題:認證流程?
- 許可權
- 許可權是否可以放在中介軟體中?以及為什麼?
- 訪問頻率的控制
- 匿名使用者可以真正的防止?無法做到真正的訪問頻率控制,只能把小白拒之門外。
如果要封IP,使用防火牆來做。
- 登入使用者可以通過使用者名稱作為唯一標示進行控制,如果有人註冊很多賬號,也無法防止。
- 檢視
- 解析器 ,根據Content-Type請求頭對請求體中的資料格式進行處理。request.data
- 分頁
- 序列化
- 序列化
- source
- 定義方法
- 請求資料格式校驗
- 渲染器
65、django rest framework框架中的檢視都可以繼承哪些類?
a. 繼承 APIView
這個類屬於rest framework中頂層類,內部幫助我們實現了只是基本功能:認證、許可權、頻率控制,但凡是資料庫、分頁等操作都需要手動去完成,比較原始。
class GenericAPIView(APIView)
def post(...):
pass
b. 繼承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
如果繼承它之後,路由中的as_view需要填寫對應關係 .as_view({‘get’:’list’,’post’:’create’})
在內部也幫助我們提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer
注意:要設定queryset欄位,否則會跑出斷言的異常。
# 只提供增加功能
class TestView(GenericViewSet):
serializer_class = XXXXXXX
def create(self,*args,**kwargs):
pass # 獲取資料並對資料進行操作
c. 繼承
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
對資料庫和分頁等操作不用我們在編寫,只需要繼承相關類即可。
示例:只提供增加功能
class TestView(mixins.CreateModelMixin,GenericViewSet):
serializer_class = XXXXXXX
66、簡述 django rest framework框架的認證流程。
- 如何編寫?寫類並實現authticate
- 方法中可以定義三種返回值:
- (user,auth),認證成功
- None , 匿名使用者
- 異常 ,認證失敗
- 流程:
- dispatch
- 再去request中進行認證處理
67、django rest framework如何實現的使用者訪問頻率控制?
a. 基於使用者IP限制訪問頻率
b. 基於使用者IP顯示訪問頻率(利於Django快取)
c. view中限制請求頻率
d. 匿名時用IP限制+登入時用Token限制
68、Flask框架的優勢?
一、整體設計方面
首先,兩者都是非常優秀的框架。整體來講,兩者設計的哲學是區別最大的地方。Django提供一站式的解決方案,從模板、ORM、Session、Authentication等等都分配好了,連app劃分都做好了,總之,為你做盡量多的事情,而且還有一個killer級的特性,就是它的admin,配合django-suit,後臺就出來了,其實最初Django就是由在新聞釋出公司工作的人設計的。Flask只提供了一些核心功能,非常簡潔優雅。它是一個微框架,其他的由擴充套件提供,但它的blueprint使它也能夠很方便的進行水平擴充套件。
二、路由設計
Django的路由設計是採用集中處理的方法,利用正則匹配。Flask也能這麼做,但更多的是使用裝飾器的形式,這個有優點也有缺點,優點是讀原始碼時看到函式就知道怎麼用的,缺點是一旦原始碼比較長,你要查路由就不太方便了,但這也促使你去思考如何更合理的安排程式碼。
三、應用模組化設計
Django的模組化是整合在命令裡的,也就是說一開始Django的目標就是為以後玩大了做準備的。每個都是一個獨立的模組,為以後的複用提供了便利。Flask通過Blueprint來提供模組化,自己對專案結構劃分成不同的模組進行組織。
69、Flask框架依賴元件?
- Route(路由)
- templates(模板)
- Models(orm模型)
- blueprint(藍圖)
- Jinja2模板引擎
70、Flask藍圖的作用?
- 將不同的功能模組化
- 構建大型應用
- 優化專案結構
- 增強可讀性,易於維護(跟Django的view功能相似)
71、列舉使用過的Flask第三方元件?
內建:
- 配置
- 路由
- 檢視
- 模板
- session
- 閃現
- 藍圖
- 中介軟體
- 特殊裝飾器
第三方:
- Flask元件:
- flask-session
- flask-SQLAlchemy
- flask-migrate
- flask-script
- blinker
- 公共元件:
- wtforms
- dbutile
- sqlalchemy
- 自定義Flask元件
- auth ,參考flask-login元件
72、簡述Flask上下文管理流程?
每次有請求過來的時候,flask 會先建立當前執行緒或者程序需要處理的兩個重要上下文物件,把它們儲存到隔離的棧裡面,這樣檢視函式進行處理的時候就能直接從棧上獲取這些資訊。
73、Flask中的g的作用?
g 相當於一次請求的全域性變數,當請求進來時將g和current_app封裝為一個APPContext類,在通過LocalStack將Appcontext放入Local中,取值時通過偏函式,LocalStack、loca l中取值,響應時將local中的g資料刪除
74、Flask中上下文管理主要涉及到了那些相關的類?並描述類主要作用?
- flask
- requestcontext
- request
- securecookiesessioninterface
- securecookiesession
75、為什麼要Flask把Local物件中的的值stack 維護成一個列表?
當是web應用時:不管是單執行緒還是多執行緒,棧中只有一個數據
- 服務端單執行緒:
{
111:{stack: [ctx, ]}
}
- 服務端多執行緒:
{
111:{stack: [ctx, ]}
112:{stack: [ctx, ]}
}
76、Flask中多app應用是怎麼完成?
請求進來時,可以根據URL的不同,交給不同的APP處理
77、在Flask中實現WebSocket需要什麼元件?
Flask-SocketIO
Flask-Sockets是Flask框架的一個擴充套件,通過它,Flask應用程式可以使用WebSocket。
78、wtforms元件的作用?
79、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
81、Flask中 blinker 是什麼?
Flask框架中的訊號基於blinker,可以讓開發者在flask請求過程中 定製一些使用者行為執行。
在請求前後,模板渲染前後,上下文前後,異常 的時候
82、SQLAlchemy中的 session和scoped_session 的區別?
使用scoped_session的目的主要是為了執行緒安全。
scoped_session類似單例模式,當我們呼叫使用的時候,會先在Registry裡找找之前是否已經建立session了。
要是有,就把這個session返回。
要是沒有,就建立新的session,註冊到Registry中以便下次返回給呼叫者。
這樣就實現了這樣一個目的:在同一個執行緒中,call scoped_session 的時候,返回的是同一個物件
83、SQLAlchemy如何執行原生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 ;')
84、ORM的實現原理?
概念: 物件關係對映(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直接編碼,能夠像操作物件一樣從資料庫獲取資料。
85、DBUtils模組的作用?
使用DBUtils模組
兩種使用模式:
1. 為每個執行緒建立一個連線,連線不可控,需要控制執行緒數
1. 建立指定數量的連線在連線池,當執行緒訪問的時候去取,如果不夠了執行緒排隊,直到有人釋放。平時建議使用這種!
86、以下SQLAlchemy的欄位是否正確?如果不正確請更正:
fromdatetime importdatetime
fromsqlalchemy.ext.declarative
importdeclarative_base
fromsqlalchemy importColumn, Integer, String, DateTime
Base = declarative_base()
classUserInfo(Base):
__tablename__ = 'userinfo'
id = Column(Integer, primary_key= True, autoincrement= True)
name = Column(String( 64), unique= True)
ctime = Column(DateTime, default=datetime.now())
ctime欄位中的引數應該為default=datetime.now, now後面不應該加括號.如果加了,欄位不會隨時更新
87、SQLAchemy中如何為表設定引擎和字元編碼?
sqlalchemy設定編碼字符集一定要在資料庫訪問的URL上增加charset=utf8,否則資料庫的連線就不是utf8的編碼格式
eng = create_engine(‘mysql://root:[email protected]:3306/test2?charset=utf8’,echo=True)
88. SQLAlchemy中如何設定聯合唯一索引?
UniqueConstraint 設定聯合唯一索引
89、簡述Tornado框架的特點。
Tornado的獨特之處在於其所有開發工具能夠使用在應用開發的任意階段以及任何檔次的硬體資源上。而且,完整集的Tornado工具可以使開發人員完全不用考慮與目標連線的策略或目標儲存區大小。
Tornado 結構的專門設計為開發人員和第三方工具廠商提供了一個開放環境。已有部分應用程式介面可以利用並附帶參考書目,內容從開發環境介面到連線實現。Tornado包括強大的開發和除錯工具,尤其適用於面對大量問題的嵌入式開發人員。這些工具包括C和C++原始碼級別的偵錯程式,目標和工具管理,系統目標跟蹤,記憶體使用分析和自動配置. 另外,所有工具能很方便地同時執行,很容易增加和互動式開發。
90、簡述Tornado框架中Future物件的作用?
91. Tornado框架中如何編寫WebSocket程式?
92、Tornado中靜態檔案是如何處理的?如:
處理方法:
static_path = os.path.join(os.paht.dirname(file), “static”) #這裡增加設定了靜態路徑
另外一個修改就是在例項化 tornado.web.Application() 的時候,在引數中,出了有靜態路徑引數 static_path ,還有一個引數設定 debug=True
93、Tornado操作MySQL使用的模組?
torndb是一個輕量級的基於MySQLdb封裝的一個模組,從tornado3.0版本以後,其已經作為一個獨立模組發行了。torndb依賴於MySQLdb模組,因此,在使用torndb模組時,要保證系統中已經有MySQLdb模組。
94、Tornado操作redis使用的模組?
tornado-redis
95、簡述Tornado框架的適用場景?
Tornado是使用Python編寫的一個強大的、可擴充套件的Web伺服器。它在處理嚴峻的網路流量時表現得足夠強健,但卻在建立和編寫時有著足夠的輕量級,並能夠被用在大量的應用和工具中。
我們現在所知道的Tornado是基於Bret Taylor和其他人員為FriendFeed所開發的網路服務框架,當FriendFeed被Facebook收購後得以開源。不同於那些最多隻能達到10,000個併發連線的傳統網路伺服器,Tornado在設計之初就考慮到了效能因素,旨在解決C10K問題,這樣的設計使得其成為一個擁有非常高效能的框架。此外,它還擁有處理安全性、使用者驗證、社交網路以及與外部服務(如資料庫和網站API)進行非同步互動的工具。
相關推薦
python之web面試題
1、談談你對http協議的認識。 HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的
python web 面試題彙總
轉自https://github.com/taizilongxu/interview_python1 Python的函式引數傳遞看兩個例子:a = 1 def fun(a): a = 2 fun(a) print a # 1a = [] def fun(a):
web 面試題
打開 lenet 創建 rtu net 發的 code url重寫 page JAVAWEB 面試題 1. css和div 開發的優勢? 顯示和內容實現分離 有利於搜索引擎搜索 有利於維護和程序的擴展 2. 談談頁面間的參數傳遞有哪些方式 ? 通過作用域對象sessio
Python之Web框架介紹
楊文 python gateway 應用程序 服務器 第三方 所有的語言Web框架本質其實就是起一個socket服務端,監聽一個端口,然後運行起來Web框架包含兩部分,一部分是socket,另外一部分是業務的邏輯處理,根據請求的不同做不同的處理Python的Web框架分成了兩類,即包含
Python--練習及面試題
題面試1. 企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高 於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提 成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於 40萬元的部分,
29、Python之Web框架Django入門
char rip 目的 temp 安裝完成 ron 們的 執行命令 一個 一、Django入門 1、django的安裝。django的安裝和安裝其他模塊一樣,我們找到python的安裝目錄的script目錄,然後執行命令:pip3 install Django即可。安裝
linux基礎命令之企業面試題
con test 不包含 模擬 cto for oca 顏色 mtime 1.如何過濾出已知當前目錄下linzhongniao中的所有一級目錄(提示:不包含linzhongniao目錄下面目錄的子目錄及隱藏目錄,即只能是一級目錄)創建模擬數據: [root@linzhong
詳解兩個佇列實現一個棧(python實現——經典面試題)
1、任務詳解 使用兩個佇列資料結構實現一個棧,要求實現棧的出棧和進棧操作。 2、解題思路 push()操作: 為了保證先進
詳解兩個棧實現一個佇列(python實現——經典面試題)
1、題目說明 使用兩個棧結構,實現一個佇列功能,實現佇列的新增元素和彈出元素。 注意: 佇列特點是隻能在佇列尾部新增元素,在佇列頭部刪除元素,先進先出(FIFO/
拉手網Python程式設計師面試題
拉手網Python程式設計師面試題 拉手網Python程式設計師面試題,有用人用10行程式碼解決,有人用了一行程式碼解決是多麼牛的趕腳。有種被秒殺的趕腳,題目在此https://www.jinshuju.net/f/EGQL3D dic={} def num(aa,bb,cc):
Python 第一階段面試題答案
承接上一篇文章 此答案不是標準答案 1、 break 用在條件滿足即結束迴圈,跳出迴圈體,進行後面的程式 continue 結束本次迴圈,進行下次迴圈,需要把迴圈語句的每一個case都驗證一下,符合條件的case跳過,執行後面的迴圈中 return 跳出迴圈體所在的方法,相當於結束該方法
Python 第一階段面試題
一、Python 基礎 continue 和 break 有什麼區別? Python 中的作用域? 談談對閉包的理解? Python 裡的拷貝?理解引用和 copy(),deepcopy()的區別。 Python 垃圾回收機制?
面試題之演算法面試題(一)
問題: 1. 輸入一個個數較大的正整數陣列[數字範圍在0~9999],將部分陣列元素的十進位制表示連線起來排成一個數,輸出能排出的所有數字中最大的一個。find例如輸入陣列{3423,33,456,9,8,7,21}和3,則輸出的最大數為:456342333。 要求: (1) 輸出數字用
大資料面試題分享之spark面試題
一 什麼是spark Spark是大資料的排程,監控和分配引擎。它是一個快速通用的叢集計算平臺.Spark擴充套件了流行的MapReduce模型.Spark提供的主要功能之一就是能夠在記憶體中執行計算 ,但對於在磁碟上執行的複雜應用程式,系統也比MapReduce更有效。
看透Python常見的面試題,為你的面試獻上神助攻!
在本文開頭,我弱弱的問一句各位學習Python的大佬學習Python的目的,我想大部分是想通過Python來找到一份心儀的工作(猜測而已,希望各位大佬勿怪),所以今天給大家帶來一篇面試題及其答案,希望各位大佬笑納。題目及其答案如下: 大資料的檔案讀取 ① 利用生成器gener
小白學習路之Javascript 面試題
1、什麼是 JavaScript? JavaScript 是客戶端和伺服器端指令碼語言,可以插入到 HTML 頁面中,並且是目前較熱門的 Web 開發語言。同時,JavaScript 也是面向物件程式語言。 類似的基本題目還包括:JavaScript 都有哪些
前端之vue面試題
1、active-class是哪個元件的屬性?巢狀路由怎麼定義? 答:vue-router模組的router-link元件。 2、怎麼定義vue-router的動態路由?怎麼獲取傳過來的動態引數? 答:在router目錄下的index.js檔案中,對path屬性
撩課-每天刷Web面試題(前10天彙總)-Day12
一、演算法題部分 1. 如何獲取瀏覽器URL中查詢字串中的引數 function getParamsWithUrl(url) { var args = url.split('?'); if (args[0] === url) { return
Python之web框架淺談
""" <axiner>宣告:(錯了另刂扌丁我) (如若有誤,請記得指出喲,謝謝了!!!) """ Web application frameworks(網路應用框架),簡稱:web框架,用於構建web應用。 以下是axiner自制的一張簡圖: &n