Django Web应用开发实战附录A
Django面試題
1.Python解釋器有哪些類型,有什么特點(diǎn)?
CPython:由C語言開發(fā),而且使用范圍最廣泛
IPython:基于CPython的一個交互式計(jì)時器
PyPy:提高執(zhí)行效率,采用JIT技術(shù)。對Python代碼進(jìn)行動態(tài)編譯
JPython:運(yùn)行在Java上的解釋器,直接把Python代碼編譯成Java字節(jié)碼執(zhí)行
IronPython:運(yùn)行在微軟.MET平臺上的解釋器,把Python編譯成.NET的字節(jié)碼
2.什么是PEP8?
《Pyhon Enhancement Proposal》(8號Python增強(qiáng)提案)又叫PEP8,它是針對Python代碼格式而編訂的編寫規(guī)范指南,可以在Pycharm配置Autopep8模塊,將代碼自動調(diào)整為PEP8風(fēng)格。
3.什么是Python之禪?
在Python交互模式下,輸入import this語句可以獲取具體的內(nèi)容,它告訴大家如何寫出高效整潔的代碼。
4.使用json模式將字典轉(zhuǎn)換成JSON格式,默認(rèn)將中文轉(zhuǎn)換成unicode,如何將中文保持不變?
import json
a = json.dumps({"name": "張三"}, ensure_ascii=False)
print(a)
5.如何輸出1-100的所有偶數(shù)?
# 方法1
[i for i in range(1, 101) if i % 2 == 0] # 方法2
list(range(2, 101, 2))
6.Python的數(shù)據(jù)類型如何相互轉(zhuǎn)換?
數(shù)據(jù)類型可以使用str、list、tuple、dict和eval實(shí)現(xiàn)轉(zhuǎn)換,但轉(zhuǎn)換的數(shù)據(jù)格式必須符合數(shù)據(jù)格式要求,比如字符串"{'a':1}"只能轉(zhuǎn)換為字典類型,不能轉(zhuǎn)化為元組或列表。
7.數(shù)據(jù)庫Redis有哪些基本類型?
Redis支持5種數(shù)據(jù)類型:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set有序集合)
8.數(shù)據(jù)庫事務(wù)是什么?
數(shù)據(jù)庫事務(wù)指作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全執(zhí)行,要么完全不執(zhí)。行簡單滴說,事務(wù)就是并發(fā)控制的單位,是用戶定義一個操作序列。而一個邏輯工作單元要成為事務(wù)就必須滿足ACID屬性:
A:原子性(Atomicity),事務(wù)中的操作要么都不做,要么全做。
C:一致性(Consistency):事務(wù)執(zhí)行的結(jié)果必須使數(shù)據(jù)從一個一致性狀態(tài)轉(zhuǎn)換到另一個一致性狀態(tài)。
I:隔離性(Isolation),一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。
D:持久性(Durability),一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。
9.函數(shù)裝飾器有什么作用?舉例說明。
裝飾器就是一個函數(shù),它可以在不需要做任何代碼變動的前提下給下一個函數(shù)增加額外功能,啟動裝飾的效果。它經(jīng)常用于有切面需求的場景,比如插入日志、性能測試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場景。
10.什么是metaclass?它有什么應(yīng)用場景?
metaclass即元類,它是創(chuàng)建類的類,所有的類都是由元類調(diào)用new方法創(chuàng)建的,重寫元類可以自由控制創(chuàng)建類的過程,比如使用元類創(chuàng)建單例模式或ORM框架,Django的ORM框架實(shí)現(xiàn)原理是通過重寫元類實(shí)現(xiàn)的。
11.列舉Django中間件常用的鉤子函數(shù)以及中間件的應(yīng)用場景。
__init__():初始化函數(shù),運(yùn)行Django將自動執(zhí)行該函數(shù)
process_request():完成請求對象的創(chuàng)建,但用戶訪問的網(wǎng)站尚未與網(wǎng)站的路由地址匹配。
process_view():完成用戶訪問的網(wǎng)址與網(wǎng)站路由的匹配,但尚未執(zhí)行視圖函數(shù)。
process_exception():在執(zhí)行視圖函數(shù)期間發(fā)生異常,比如代碼異常、主動拋出404異常等。
process_response():完成視圖的執(zhí)行,但尚未將響應(yīng)內(nèi)容返回瀏覽器。
中間件不能滿足復(fù)雜的開發(fā)需求,還能減少視圖函數(shù)或視圖類的代碼量,比如編寫Cookie內(nèi)容實(shí)現(xiàn)反爬機(jī)制、微信公眾號開發(fā)商城等
12.簡述Django的生命周期。
生命周期是從用戶發(fā)送HTTP請求到網(wǎng)站響應(yīng)的過程,整個過程包含:發(fā)送HTTP請求-->Nginx-->uwsgi-->中間件-->路由-->視圖-->ORM-->從ORM獲取數(shù)據(jù)返回視圖-->視圖將數(shù)據(jù)傳遞給模板文件-->中間件-->uwsgi-->Nginx-->生成響應(yīng)內(nèi)容。
13.簡述什么是FBV和CBV
使用視圖函數(shù)處理HTTP請求,即在視圖里定義def函數(shù),這種方式稱為FBV(Function Based Views)在無需知道大量代碼的情況下,快速完成數(shù)據(jù)視圖的開發(fā),這種累的形式實(shí)現(xiàn)響應(yīng)與請求處理稱為CBV(Class Based Views)。
14.select_related 和 prefetch_related的區(qū)別是什么?
select_related通過多數(shù)據(jù)表關(guān)系關(guān)聯(lián)查詢,一次性獲得所有數(shù)據(jù),只執(zhí)行一次SQL查詢;
prefetch_related分別查詢每個表,然后根據(jù)它們之間的關(guān)系進(jìn)行處理,執(zhí)行了兩次查詢。
15.列舉Django編寫SQL語句的方法。
Django提供3種方法執(zhí)行SQL語句,extra、raw、execute
16.模型的外鍵字段參數(shù)on_delete有什么作用?
用于設(shè)置數(shù)據(jù)的刪除模式,刪除模型包括:CASCADE、PROTECT、SET_NULL、SET_DEFAULT
17.ORM的only 和 defer的區(qū)別是什么?
# only只查詢部分模型字段,defer查詢指定字段之外的字段。
User.objects.all().only("id", "name", "age") # 查詢這3個字段
User.objects.all().defer("name") # 查詢name字段外的所有字段
18.簡述Django的values 和 values_list的區(qū)別。
values將查詢結(jié)果以列表表示,列表的每個元素以字典格式表示,每個鍵值對代表一個模型字段;
values_list以列表表示,列表每個元素以元組表示,元組每個元素代表模型字段的值。
19.簡述Django中的db first 和 code first。
db first根據(jù)現(xiàn)有數(shù)據(jù)表結(jié)構(gòu)生成相應(yīng)的模型對象,使用python manage.py inspectdb指令即可生成模型對象的定義過程;
code first是編寫模型對象的定義過程,由模型對象創(chuàng)建相應(yīng)的數(shù)據(jù)表,依次執(zhí)行makemigrations和migrate指令。
20.闡述Django中中CSRF實(shí)現(xiàn)原理。
(1)在用戶訪問網(wǎng)站時,Django在網(wǎng)頁表單中生成隱藏控件csrfmiddlewaretoken,控件屬性value的值是由Django隨機(jī)生成。
(2)當(dāng)用戶提交表單時,Django校驗(yàn)表單的csrfmiddlewaretoken與資金保存的是否一致,用來判斷當(dāng)前請求是否合法。
(3)如果用戶被CSRF攻擊并從其他地方發(fā)起攻擊請求,由于其他地方不知道Django在網(wǎng)頁表單中生成隱藏控件csrfmiddlewaretoken的值,因此后臺校驗(yàn)Django在網(wǎng)頁表單中生成隱藏控件csrfmiddlewaretoken失敗,攻擊就被成功防御。
21.Django有哪些緩存方式?
Django提供5中不同的緩存方式:Memcached、數(shù)據(jù)庫緩存、文件系統(tǒng)緩存、本地內(nèi)存緩存和虛擬緩存。
22.Django如何實(shí)現(xiàn)WebSocket?
官方推薦使用Channels。Channels通過將HTTP協(xié)議升級為WebSocket協(xié)議,保證實(shí)時通信。也就是說,完全可以使用Channels實(shí)現(xiàn)實(shí)時通信,而不是使用長輪詢和計(jì)時器方式來保證偽實(shí)時通信。Channels通過改造Django框架,使Django既支持HTTP協(xié)議又支持WebSocket協(xié)議。
23.簡述Cookie 和 Session的區(qū)別
Cookie是從瀏覽器向服務(wù)器發(fā)送的數(shù)據(jù),讓服務(wù)器能夠識別當(dāng)前用戶,而服務(wù)器對Cookie的識別機(jī)制是通過Session實(shí)現(xiàn)的,Session存儲了當(dāng)前用戶基本信息。由于Cookie是存儲在瀏覽器中的,就跟容易泄露用戶信息,并且Cookie大小不能超過4kb,不支持中文。因此,需要一種機(jī)制在服務(wù)器的某個域中存儲用戶數(shù)據(jù),這個域就是Session。
24.Django本身提供runserver,為什么不能用來部署(runserver與uWSGI的區(qū)別)?
runserver是調(diào)試Django時經(jīng)常用到的方式,它使用Django自帶的WSGI Server運(yùn)行。只要在開發(fā)測試中使用,并且runserver開啟方式是單進(jìn)程的。
uWSGI是一種Web服務(wù)器它實(shí)現(xiàn)了WSGI、uwsgi、HTTP等協(xié)議。uwsgi是一種通信協(xié)議,而uWSGI是實(shí)現(xiàn)uwsgi和WSGI協(xié)議的Web服務(wù)器。
uWSGI具體超快的性能、低內(nèi)存占用等優(yōu)點(diǎn),并且搭配著Nginx組成項(xiàng)目的生產(chǎn)環(huán)境,能夠?qū)⒂脩粼L問請求與應(yīng)用隔離,實(shí)現(xiàn)真正的網(wǎng)站部署。相對來說,這種方式支持的并發(fā)量更高,方便管理多進(jìn)程,發(fā)揮多核的優(yōu)勢,提升性能。
25.什么是跨域訪問?Django如何解決跨域訪問?
跨域訪問指的是瀏覽器不能執(zhí)行其他網(wǎng)站的JavaScript腳本,它是由瀏覽器的同源策略造成的,這是瀏覽器對JavaScript施加的安全限制。
解決跨域訪問有多種方式,目前最佳的解決方案是使用第三方功能應(yīng)用Django Cors Headers。
總結(jié)
以上是生活随笔為你收集整理的Django Web应用开发实战附录A的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Got bad greeting fro
- 下一篇: 资深育儿专家智能体,AI都已经涉及这块了