面試題--web(django)

django

  1. django建立項目的命令?
    django-admin startproject 項目名稱
    python manage.py startapp  應用app名
  2. django建立項目後,項目文件夾下的組織部分(對mvt的理解)?

    項目文件夾下的組成部分:
    manage.py 是項目運行的入口,指定配置文件路徑。
    與項目同名的目錄,包含項目的配置文件。
    ___init.py 是一個空文件,做用是這個目錄能夠被看成包使用。
    settings.py 是項目的總體配置文件。
    urls.py 是項目的URL 配置文件。
    wsgi.py 是項目與WSGI 兼容的Web 服務器。javascript

  3. 對MVC和MVT解讀的理解?
    M:model,模型和數據庫進行交互
    V:view,視圖,負責生產html頁面
    C:controller,控制器,接收請求,進行處理,與M,V進行交互

    1、用戶點擊注按鈕,將要註冊的信息發送給網站服務器。
    2、Controller 控制器接收到用戶的註冊信息,Controller 會告訴Model 層將用戶的註冊信息保
    存到數據庫
    3、Model 層將用戶的註冊信息保存到數據庫
    4、數據保存以後將保存的結果返回給Model 模型,
    5、Model 層將保存的結果返回給Controller 控制器。
    6、Controller 控制器收到保存的結果以後,或告訴View 視圖,view 視圖產生一個html 頁面。
    7、View 將產生的Html 頁面的內容給了Controller 控制器。
    8、Controller 將Html 頁面的內容返回給瀏覽器。
    九、瀏覽器接受到服務器Controller 返回的Html 頁面進行解析展現。

    M:Model,模型,和MVC 中的M 功能相同,和數據庫進行交互。css

    V:view,視圖,和MVC 中的C 功能相同,接收請求,進行處理,與M 和T 進行交互,返回應答。
    T:Template,模板,和MVC 中的V 功能相同,產生Html 頁面

    html

    1、用戶點擊註冊按鈕,將要註冊的內容發送給網站的服務器。
    2、View 視圖,接收到用戶發來的註冊數據,View 告訴Model 將用戶的註冊信息保存進數據庫。
    3、Model 層將用戶的註冊信息保存到數據庫中。
    4、數據庫將保存的結果返回給Model
    5、Model 將保存的結果給View 視圖。
    6、View 視圖告訴Template 模板去產生一個Html 頁面。
    7、Template 生成html 內容返回給View 視圖。
    8、View 將html 頁面內容返回給瀏覽器。
    九、瀏覽器拿到view 返回的html 頁面內容進行解析,展現。

     

  4. Django 中models 利用ORM 對Mysql 進行查表的語句(多個語句)?
    字段查詢
    all():返回模型對應表格中的全部數據
    get():返回表格中知足條件的一條數據,若是查到多條數據,則拋出異常:MultipleObjectsReturned,查詢不到數據,則跑異常:DoesNotExist
    
    filter():參數寫查詢條件,返回知足條件 QuerySet 集合數據
    條件格式:
    **模型類屬性名**__條件名=值
    注意:此處是模型類屬性名,不是表中的字段名
    關於filter 具體案例以下:
    判等exact。
    1. BookInfo.object.filter(id=1)
    2. BookInfo.object.filter(id__exact=1)此處的__exact 能夠省略
    
    like  模糊查詢
    
    例:查詢書名包含‘傳’的圖書,contains
    contains :   Bookinfo.objects.filter(bittle__contains='')
    
    空查詢 where 字段名 isnull
    BookInfo.objects.filter(bittle__isnull=False)
    
    範圍查詢 where id in (1,2,3)
    BookInfo.objects.filter(id__in=[1,2,3])
    
    比較查詢 gt  It(less  than)  gte(equal) Ite
    1. BookInfo.objects.filter(id__gte=3)
    日期查詢
    1. BookInfo.objects.filter(bpub_date__year = 1980)
    2. BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))
    exclude:返回不知足條件的數據。
    3. BookInfo.objects.exclude(id=3)
    
    F  對象
    做用:用於類屬性之間的比較條件
    
    from django.db.models import F
    2. 例:where bread > bcomment BookInfo.objects.filter(bread__gt =F(‘bcomment’))
    3. 例:BookInfo.objects.filter(bread__gt=F(‘bcomment’)*2)
    Q 對象
    做用:用於查詢時的邏輯條件,能夠對Q 對象進行& | ~操做
    
    from django.db.models.import Q
    BookInfo.objects.filter(id__gt=3, bread__gt=30)
    BookInfo.objects.filter(Q(id__gt=3) & Q(bread__gt=3))
    4. 例:BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))
    5. 例:BookInfo.objects.filter(~Q(id=3))
    
    聚合查詢
    做用: 對查詢結果進行聚合操做
    (sum  count  max  min  avg)
    
    aggregate: 調用這個函數使用聚合
    from django,db,models  import Sum, Count, Max, Min, Avg
    例: BookInfo.onjects.aggregate(Count('id'))
    
    ('id__count': 5) 注意返回值類型及鍵名
    
    BookInfo.Objects.aggregate(Sum('bread'))
    
    {'bread__sum' : 120}  注意返回類型及鍵名
    count  函數
    做用:統計知足條件數據的數據
    例:統計多有圖書的數目
    BookInfo.objects.all().count()
    例:統計id大於3的全部圖書的數目
    BookInfo.objects.filter(id__gt=3).count()
    
    模型類關係
    1)一對多關係
    例:圖書類-英雄類
    models.ForeignKey() 定義在多的類中
    2) 多對多的關係
    例:新聞類-新聞類型類
    models.ManyToManyField()  定義在哪一個類中均可以
    3)一對一關係
    例員工基本信息類--員工詳細信息類
    models.OneToOneField() 定義在哪一個類中均可以
    View Code

     

  5. django中間件的使用?
    django在中間件中預設了6個方法,這6個方法區別在於不一樣的階段執行,對輸入或輸出進行干預,方法以下:
    1 初始化: 無需任何參數,服務器響應第一個請求的時候調用一次,用於肯定是否啓用當前中間件
    
    def __init__():
        pass
    
    2.處理請求前:在每一個請求上調用,返回None或者HttpResponse 對象
    
    def process_response(request):
        pass
    
    3 處理視圖前,在每一個請求上調用,返回None 或HttpResopnse對象
    def  process_view(request.view_func, view_args, view_kwargs):
        pass
    
    4 處理模板響應前: 在每一個請求上調用,返回實現render 方法的響應對象
    def peocess_template_response(request, response):
        pass
    5 處理響應後,多有響應返回瀏覽器以前被調用,每一個請求上調用,返回HttpResponse對象
    
    def process_response(request, response):
        pass
    
    6  異常處理:當時圖拋出異常時調用,在每一個請求上調用,返回一個HttpResponse對象
    def process_exception(request, execption):
        pass

     

  6. 談一下你對UWSGI和nginx的理解
    uWSGI:一個web服務器,它實現了WSGI協議,uwsgi,http等協議. Nginx中,HttpUwsgiModule的做用是與uwsgi服務器進行交換,WSGI是一種web服務器網關接口,他是一個web服務器(如nginx,uwsgi等服務器)與web應用(如Flask框架寫的程序)通訊的一種規範
    要注意WSGI/ uwsgi/ uWSGI這三個概念的區分
    
    WSGI:一種通訊協議
    uwsgi: 是一種線路協議而不是通訊協議,再次經常使用用於在uWSGI服務器與其餘網絡服務器的數據通訊
    uWSGI: 是實現uwsgi和WSGI兩種協議的web服務器

    nginx:是一個開源的高性能的HTTP的服務器和反向代理:前端

    1.做爲web 服務器,它處理靜態文件和索引文件效果很是高;
    2.它的設計很是注重效率,最大支持5萬個併發連接,但只佔用不多的內存空間;
    3.穩定性高,配置簡介;
    4.強大的反向代理和負載均衡功能,平衡集羣中各個服務器的負載壓力應用

     

  7. 說說nginx和uWSGI 服務器之間如何配合工做的?
    首先瀏覽器發起http請求到nginx服務器,Nginx根據接收到的請求包,進行url分析,判斷訪問的資源類型,若是是靜態資源,直接讀取靜態資源返回給瀏覽器,若是請求的是動態資源就是轉交給uwsgi服務器,uwsgi服務器根據自身的uwsgi和WSGI協議,找到對應的django框架,django框架下的應用進行邏輯處理後將返回值發送到uwsgi服務器,而後uwsgi在返回給nginx,最後nginx將返回值返回給瀏覽器進行渲染顯示給用戶。
  8. django開發中數據作過什麼優化?
    1.設計表時,儘可能少使用外鍵,由於外鍵約束會影響插入和刪除性能
    2.使用緩存,減小對數據庫的訪問
    3.orm框架下設置表時,能使用varchar肯定字段長度時,就別用text
    4.能夠給搜索頻率搞得字段屬性,在定義時建立索引
    5. django orm 框架下的Querysets  原本就有緩存的
    6.若是一個頁面須要屢次連接數據庫,最好一次性去除全部須要的數據,減小數據庫的查詢次數
    7, 若頁面只須要數據庫裏面的某一兩個字段時,能夠用QuerySet.values()
    8.在模板標籤裏使用with標籤能夠緩存Qset查詢結果
  9. 驗證碼過時時間怎麼設置?
    將驗證碼保存到數據庫或者session,設置過時時間爲1分鐘,而後也買你設置一個倒計時(通常爲前端js實現 這個計時)的展現,一分鐘事後再次點擊獲取新的信息
  10. Python中三大礦機各自的應用場景?
    django:主要用來開蘇開發的,他的亮點是快速開發,節約成本,正常的開發量不過10000,若是要實現高併發的化,就要對django 進行二次開發,好比把整個笨重的框架給拆掉,本身寫socket實現http 的通訊,底層用純c,c++寫提高效率,ORM 框架給幹掉,本身編寫封裝與數據庫交互的框架,由於啥呢,ORM 雖然面向對象來操做數據庫,可是它的效率很低,使用外鍵來聯繫表與表之間的
    查詢;
    flask:輕量級,主要是用來寫接口的一個框架,實現先後端分離,提高開發效率,Flask 自己至關於一個內核,其餘幾乎全部的功能都要用到擴展(郵件擴展Flask-Mail,用戶認證Flask-Login),都須要用第三方的擴展來實現。好比能夠用Flask-extension 加入ORM、窗體驗證工具,文件上傳、身份驗證等。Flask 沒有默認使用的數據庫,你能夠選擇MySQL,也能夠用NoSQL。
    其WSGI 工具箱採用Werkzeug(路由模塊),模板引擎則使用Jinja2。這兩個也是Flask 框架的核心。Python 最出名的框架要數Django,此外還有Flask、Tornado 等框架。雖然Flask 不是最出名的框架,可是Flask 應該算是最靈活的框架之一,這也是Flask 受到廣大開發者喜好的緣由。
    Tornado: Tornado 是一種Web 服務器軟件的開源版本。Tornado 和如今的主流Web 服務器框架(包括大多數Python 的框架)有着明顯的區別:它是非阻塞式服務器,並且速度至關快。得利於其非阻塞的方式和對epoll 的運用,Tornado 每秒能夠處理數以千計的鏈接,所以Tornado是實時Web 服務的一個理想框架。

     

  11. django如何提高性能?(高併發)
    對於後端開發程序員來講,提高性能指標主要有兩個,一個是併發數,另外一個是響應時間網站站性能的優化,通常包括web前端性能優化,應用服務器性能優化,儲存服務器優化
    對前端的優化主要有:
    對前端的優化主要有:
    1.減小http 請求,減小數據庫的訪問量,好比使用雪碧圖。
    2.使用瀏覽器緩存,將一些經常使用的css,js,logo 圖標,這些靜態資源緩存到本地瀏覽器,經過設置http 頭中的cache-control 和expires 的屬性,可設定瀏覽器緩存,緩存時間能夠自定義。
    3 對html,css,javascript 文件進行壓縮,減小網絡的通訊量。
    
    對我我的而言,我作的優化主要是如下三個方面:
    1.合理的使用緩存技術,對一些經常使用到的動態數據,好比首頁作一個緩存,或者某些經常使用的數據作個緩存,設置必定得過時時間,這樣減小了對數據庫的壓力,提高網站性能。
    2.使用celery 消息隊列,將耗時的操做扔到隊列裏,讓worker 去監聽隊列裏的任務,實現異步操做,好比發郵件,發短信。
    3.就是代碼上的一些優化,補充:nginx 部署項目也是項目優化,能夠配置合適的配置參數,提高效率,增長併發量。
    4.若是太多考慮安全因素,服務器磁盤用固態硬盤讀寫,遠遠大於機械硬盤,這個技術如今沒有普及,主要是固態硬盤技術上還不是徹底成熟, 相信之後會大量普及。
    5.另外還能夠搭建服務器集羣,將併發訪問請求,分散到多臺服務器上處理。
    6.最後就是運維工做人員的一些性能優化技術了。

     

  12. 什麼是restful API ,談談你的理解?
    REST:Representational State Transfer 的縮寫,翻譯:「具象狀態傳輸」。通常解釋爲「表現層狀態轉換」。

    REST 是設計風格而不是標準。是指客戶端和服務器的交互形式。咱們須要關注的重點是如何設計
    REST 風格的網絡接口。
    REST 的特色:
    1.具象的。通常指表現層,要表現的對象就是資源。好比,客戶端訪問服務器,獲取的數據就是資
    源。好比文字、圖片、音視頻等。
    2.表現:資源的表現形式。txt 格式、html 格式、json 格式、jpg 格式等。瀏覽器經過URL 肯定資
    源的位置,可是須要在HTTP 請求頭中,用Accept 和Content-Type 字段指定,這兩個字段是對資源
    表現的描述。
    3.狀態轉換:客戶端和服務器交互的過程。在這個過程當中,必定會有數據和狀態的轉化,這種轉化
    叫作狀態轉換。其中,GET 表示獲取資源,POST 表示新建資源,PUT 表示更新資源,DELETE 表示刪
    除資源。HTTP 協議中最經常使用的就是這四種操做方式。
    RESTful 架構:java

    1.每一個URL 表明一種資源;
    2.客戶端和服務器之間,傳遞這種資源的某種表現層;
    3.客戶端經過四個http 動詞,對服務器資源進行操做,實現表現層狀態轉換。python

     

  13. 如何設計符合RESTFUL風格的API
    1、域名:

    將api 部署在專用域名下:
    http://api.example.com
    或者將api 放在主域名下:
    http://www.example.com/api/

    2、版本:ios

    將api 部署在專用域名下:
    http://api.example.com
    或者將api 放在主域名下:
    http://www.example.com/api/

    3、路徑:nginx

    路徑表示API 的具體網址。每一個網址表明一種資源。資源做爲網址,網址中不能有動詞只能有
    名詞,通常名詞要與數據庫的表名對應。並且名詞要使用複數。
    錯誤示例:
    http://www.example.com/getGoods
    http://www.example.com/listOrders
    正確示例:
    #獲取單個商品c++

    http://www.example.com/app/goods/1
    #獲取全部商品
    http://www.example.com/app/goodsgit

    4、使用標準的HTTP 方法:
    對於資源的具體操做類型,由HTTP 動詞表示。經常使用的HTTP 動詞有四個。
    GET SELECT :從服務器獲取資源。
    POST CREATE :在服務器新建資源。
    PUT UPDATE :在服務器更新資源。
    DELETE DELETE :從服務器刪除資源。
    示例:
    #獲取指定商品的信息
    GET http://www.example.com/goods/ID
    #新建商品的信息
    POST http://www.example.com/goods
    #更新指定商品的信息
    PUT http://www.example.com/goods/ID
    #刪除指定商品的信息
    DELETE http://www.example.com/goods/ID
    5、過濾信息:
    若是資源數據較多,服務器不能將全部數據一次所有返回給客戶端。API 應該提供參數,過濾返
    回結果。實例:
    #指定返回數據的數量

    http://www.example.com/goods?limit=10
    #指定返回數據的開始位置
    http://www.example.com/goods?offset=10
    #指定第幾頁,以及每頁數據的數量
    http://www.example.com/goods?page=2&per_page=20
    6、狀態碼:
    服務器向用戶返回的狀態碼和提示信息,經常使用的有:
    200 OK :服務器成功返回用戶請求的數據
    201 CREATED :用戶新建或修改數據成功。
    202 Accepted:表示請求已進入後臺排隊。
    400 INVALID REQUEST :用戶發出的請求有錯誤。
    401 Unauthorized :用戶沒有權限。
    403 Forbidden :訪問被禁止。
    404 NOT FOUND :請求針對的是不存在的記錄。
    406 Not Acceptable :用戶請求的的格式不正確。
    500 INTERNAL SERVER ERROR :服務器發生錯誤。
    7、錯誤信息:
    通常來講,服務器返回的錯誤信息,以鍵值對的形式返回。
    {
    error: 'Invalid API KEY'
    }
    8、響應結果:

    針對不一樣結果,服務器向客戶端返回的結果應符合如下規範。
    #返回商品列表
    GET http://www.example.com/goods
    #返回單個商品
    GET http://www.example.com/goods/cup
    #返回新生成的商品
    POST http://www.example.com/goods
    #返回一個空文檔
    DELETE http://www.example.com/goods
    9、使用連接關聯相關的資源:
    在返回響應結果時提供連接其餘API 的方法,使客戶端很方便的獲取相關聯的信息。
    10、其餘:
    服務器返回的數據格式,應該儘可能使用JSON,避免使用XML。

     

  14. 什麼時csrf攻擊原理?如何解決?

    簡單來講就是: 你訪問了信任網站A,而後A 會用保存你的我的信息並返回給你的瀏覽器一個
    cookie,而後呢,在cookie 的過時時間以內,你去訪問了惡意網站B,它給你返回一些惡意請求代碼,
    要求你去訪問網站A,而你的瀏覽器在收到這個惡意請求以後,在你不知情的狀況下,會帶上保存在本
    地瀏覽器的cookie 信息去訪問網站A,而後網站A 誤覺得是用戶自己的操做,致使來自惡意網站C 的
    攻擊代碼會被執:發郵件,發消息,修改你的密碼,購物,轉帳,偷窺你的我的信息,致使私人信息泄
    漏和帳戶財產安全收到威脅



  15. 啓動django服務的方法?

    runserver 方法是調試Django 時常常用到的運行方式,它使用Django 自帶的WSGI Server 運
    行,主要在測試和開發中使用,而且runserver 開啓的方式也是單進程。

  16. 怎樣測試django 框架中的代碼?

    在單元測試方面,Django 繼承python 的unittest.TestCase 實現了本身的
    django.test.TestCase,編寫測試用例一般從這裏開始。測試代碼一般位於app 的tests.py 文件中(也
    能夠在models.py 中編寫,通常不建議)。在Django 生成的depotapp 中,已經包含了這個文件,
    而且其中包含了一個測試

    用例的樣例:
    1. python manage.py test:執行全部的測試用例
    2. python manage.py test app_name, 執行該app 的全部測試用例
    3. python manage.py test app_name.case_name: 執行指定的測試用例
    一些測試工具:unittest 或者pytest

     

  17. 有過部署經驗?用的什麼技術?能夠知足多少壓力?

    1.有部署經驗,在阿里雲服務器上部署的
    2.技術有:nginx + uwsgi 的方式來部署Django 項目
    3.無標準答案(例:壓力測試一兩千)

  18. Django 中哪裏用到了線程?哪裏用到了協程?哪裏用到了進程?

    1.Django 中耗時的任務用一個進程或者線程來執行,好比發郵件,使用celery。
    2.部署django 項目的時候,配置文件中設置了進程和協程的相關配置。

  19. django 關閉瀏覽器,怎樣清除cookies 和session?
    設置Cookie
    1. def cookie_set(request):
    2. response = HttpResponse("<h1>設置Cookie,請查看響應報文頭</h1>")
    3. response.set_cookie('h1', 'hello django')
    4. return response
    讀取Cookie
    1. def cookie_get(request):
    2. response = HttpResponse("讀取Cookie,數據以下:<br>")
    3. if request.COOKIES.has_key('h1'):
    4. response.write('<h1>' + request.COOKIES['h1'] + '</h1>')
    5. return response
    以鍵值對的格式寫會話。
    1. request.session['']=值
    根據鍵讀取值。
    1. request.session.get('',默認值)
    清除全部會話,在存儲中刪除值部分。
    1. request.session.clear()
    清除會話數據,在存儲中刪除會話的整條數據。
    1. request.session.flush()
    刪除會話中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。
    1. del request.session['']
    設置會話的超時時間,若是沒有指定過時時間則兩個星期後過時。
    若是value 是一個整數,會話將在value 秒沒有活動後過時。
    若是value 爲0,那麼用戶會話的Cookie 將在用戶的瀏覽器關閉時過時。
    若是value 爲None,那麼會話永不過時。
    1. request.session.set_expiry(value)
    Session 依賴於Cookie,若是瀏覽器不能保存cookie 那麼session 就失效了。由於它須要瀏覽器的cookie 值去session 裏作對比。session 就是用來在服務器端保存用戶的會話狀態。
    cookie 能夠有過時時間,這樣瀏覽器就知道何時能夠刪除cookie 了。若是cookie 沒有設置過時時間,當用戶關閉瀏覽器的時候,cookie 就自動過時了。你能夠改變SESSION_EXPIRE_AT_BROWSER_CLOSE 的設置來控制session 框架的這一行爲。缺省狀況下,SESSION_EXPIRE_AT_BROWSER_CLOSE 設置爲False ,這樣,會話cookie 能夠在用戶瀏覽器中保持有效達SESSION_COOKIE_AGE 秒(缺省設置是兩週,即1,209,600 秒)若是你不想用戶每次打開瀏覽器都必須從新登錄的話,用這個參數來幫你。若是SESSION_EXPIRE_AT_BROWSER_CLOSE設置爲True,當瀏覽器關閉時,Django 會使cookie 失效。
    SESSION_COOKIE_AGE:設置cookie 在瀏覽器中存活的時間。

     

  20. 代碼優化從哪些方面考慮?有什麼想法?

    一、優化算法時間
    算法的時間複雜度對程序的執行效率影響最大,在Python 中能夠經過選擇合適的數據結構來優化
    時間複雜度,如list 和set 查找某一個元素的時間複雜度分別是O(n)和O(1)。不一樣的場景有不一樣的
    優化方式,總得來講,通常有分治,分支界限,貪心,動態規劃等思想。
    二、循環優化
    每種編程語言都會強調須要優化循環。當使用Python 的時候,你能夠依靠大量的技巧使得循環運
    行得更快。然而,開發者常常漏掉的一個方法是:
    避免在一個循環中使用點操做。每一次你調用方法str.upper,Python 都會求該方法的值。然而,
    若是你用一個變量代替求得的值,值就變成了已知的,Python 就能夠更快地執行任務。優化循環的關
    鍵,是要減小Python 在循環內部執行的工做量,由於Python 原生的解釋器在那種狀況下,真的會
    減緩執行的速度。(注意:優化循環的方法有不少,這只是其中的一個。例如,許多程序員都會說,列
    表推導是在循環中提升執行速度的最好方式。這裏的關鍵是,優化循環是程序取得更高的執行速度的更
    好方式之一。)

    三、函數選擇
    在循環的時候使用xrange 而不是range;使用xrange 能夠節省大量的系統內存,由於xrange()
    在序列中每次調用只產生一個整數元素。而range()將直接返回完整的元素列表,用於循環時會有沒必要

    要的開銷。在python3 中xrange 再也不存在,裏面range 提供一個能夠遍歷任意長度的範圍的
    iterator。
    四、並行編程
    由於GIL 的存在,Python 很難充分利用多核CPU 的優點。可是,能夠經過內置的模塊
    multiprocessing 實現下面幾種並行模式:
    多進程:對於CPU 密集型的程序,可使用multiprocessing 的Process,Pool 等封裝好的類,
    經過多進程的方式實現並行計算。可是由於進程中的通訊成本比較大,對於進程之間須要大量數據交互
    的程序效率未必有大的提升。
    多線程:對於IO 密集型的程序,multiprocessing.dummy 模塊使用multiprocessing 的接口封
    裝threading,使得多線程編程也變得很是輕鬆(好比可使用Pool 的map 接口,簡潔高效)。
    布式:multiprocessing 中的Managers 類提供了能夠在不一樣進程之共享數據的方式,能夠在此
    基礎上開發出分佈式的程序。
    不一樣的業務場景能夠選擇其中的一種或幾種的組合實現程序性能的優化。
    五、使用性能分析工具
    除了上面在ipython 使用到的timeit 模塊,還有cProfile。cProfile 的使用方式也很是簡單:
    python-mcProfilefilename.py,filename.py 是要運行程序的文件名,能夠在標準輸出中看到每個
    函數被調用的次數和運行的時間,從而找到程序的性能瓶頸,而後能夠有針對性地優化。
    六、set 的用法
    set 的union,intersection,difference 操做要比list 的迭代要快。所以若是涉及到求list 交
    集,並集或者差的問題能夠轉換爲set 來操做。
    七、PyPy

    PyPy 是用RPython(CPython 的子集)實現的Python,根據官網的基準測試數據,它比CPython
    實現的Python 要快6 倍以上。快的緣由是使用了Just-in-Time(JIT)編譯器,即動態編譯器,與靜態
    編譯器(如gcc,javac 等)不一樣,它是利用程序運行的過程的數據進行優化。因爲歷史緣由,目前pypy
    中還保留着GIL,不過正在進行的STM 項目試圖將PyPy 變成沒有GIL 的Python。若是python
    程序中含有C 擴展(非cffi 的方式),JIT 的優化效果會大打折扣,甚至比CPython 慢(比Numpy)。
    因此在PyPy 中最好用純Python 或使用cffi 擴展。

  21. django中間件是如何使用的?
    中間件不用繼承任何類(能夠繼承object),下面一箇中間件大概的樣子:
    1. class CommonMiddleware(object):
    2. def process_request(self, request):
    3. return None
    4.
    5. def process_response(self

    還有process_view, process_exception 和process_template_response 函數。
    1)初始化:無需任何參數,服務器響應第一個請求的時候調用一次,用於肯定是否啓用當前中間件。

    1. def __init__(self):
    2. pass

    2)處理請求前:在每一個請求上,request 對象產生以後,url 匹配以前調用,返回None 或
    HttpResponse 對象。

    1. def process_request(self, request):
    2. pass

    3)處理視圖前:在每一個請求上,url 匹配以後,視圖函數調用以前調用,返回None 或
    HttpResponse 對象。

    1. def process_view(self, request, view_func, *view_args,**view_kwargs):
    2. pass

    4)處理響應後:視圖函數調用以後,全部響應返回瀏覽器以前被調用,在每一個請求上調用,返回
    HttpResponse 對象。

    1. def process_response(self, request, response):
    2. pass

    5)異常處理:當視圖拋出異常時調用,在每一個請求上調用,返回一個HttpResponse 對象。

    1. def process_exception(self, request,exception):
    2. pass

     

  22. 有用過Django REST framework 嗎?

    Django REST framework 是一個強大而靈活的Web API 工具。使用RESTframework 的理由
    有:
    Web browsable API 對開發者有極大的好處
    包括OAuth1a 和OAuth2 的認證策略
    支持ORM 和非ORM 數據資源的序列化
    全程自定義開發——若是不想使用更增強大的功能,可僅僅使用常規的function-based views
    額外的文檔和強大的社區支持

  23. Celery 分佈式任務隊列?

    情景:用戶發起request,並等待response 返回。在本些views 中,可能須要執行一段耗時的程
    序,那麼用戶就會等待很長時間,形成很差的用戶體驗,好比發送郵件、手機驗證碼等。
    使用celery 後,狀況就不同了。解決:將耗時的程序放到celery 中執行。
    將多個耗時的任務添加到隊列queue 中,也就是用redis 實現broker 中間人,而後用多個worker 去監聽隊列
    裏的任務去執行。

     任務task:就是一個Python 函數。
     隊列queue:將須要執行的任務加入到隊列中。
     工人worker:在一個新進程中,負責執行隊列中的任務。
     代理人broker:負責調度,在佈置環境中使用redis。

  24. Jieba分詞

    Jieba 分詞支持三種分詞模式:
    精確模式:試圖將句子最精確地切開,適合文本分析;
    全模式:把句子中全部的能夠成詞的詞語都掃描出來, 速度很是快,可是不能解決歧義;
    搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提升召回率,適合用於搜索引擎分詞
    功能:
    分詞,添加自定義詞典,關鍵詞提取,詞性標註,並行分詞,Tokenize:返回詞語在原文的起始位
    置,ChineseAnalyzer for Whoosh 搜索引擎。

  25. ngnix 的正向代理與反向代理?

    web 開發中,部署方式大體相似。簡單來講,使用Nginx 主要是爲了實現分流、轉發、負載均衡,
    以及分擔服務器的壓力。Nginx 部署簡單,內存消耗少,成本低。Nginx 既能夠作正向代理,也能夠
    作反向代理。

    正向代理:請求通過代理服務器從局域網發出,而後到達互聯網上的服務器。
    特色:服務端並不知道真正的客戶端是誰。
    反向代理:請求從互聯網發出,先進入代理服務器,再轉發給局域網內的服務器。
    特色:客戶端並不知道真正的服務端是誰。
    區別:正向代理的對象是客戶端。反向代理的對象是服務端。

  26. 簡述Django 下的(內建的)緩存機制?

    一個動態網站的基本權衡點就是,它是動態的。每次用戶請求頁面,服務器會從新計算。從開銷處
    理的角度來看,這比你讀取一個現成的標準文件的代價要昂貴的多。
    這就是須要緩存的地方。
    Django 自帶了一個健壯的緩存系統來保存動態頁面這樣避免對於每次請求都從新計算。方便起見,
    Django 提供了不一樣級別的緩存粒度:能夠緩存特定視圖的輸出、能夠僅僅緩存那些很難生產出來的部
    分、或者能夠緩存整個網站Django 也能很好的配合那些「下游」緩存, 好比Squid 和基於瀏覽器
    的緩存。這裏有一些緩存沒必要要直接去控制可是能夠提供線索, (via HTTPheaders)關於網站哪些部分
    須要緩存和如何緩存。
    設置緩存:
    緩存系統須要一些設置才能使用。也就是說,你必須告訴他你要把數據緩存在哪裏- 是數據庫中,
    文件系統或者直接在內存中。這個決定很重要,由於它會影響你的緩存性能,是的,一些緩存類型要比
    其餘的緩存類型更快速。
    你的緩存配置是經過setting 文件的CACHES 配置來實現的。這裏有CACHES 全部可配置的變量
    值。

  27. 請簡述瀏覽器是如何獲取一枚網頁的?

    1.在用戶輸入目的URL 後,瀏覽器先向DNS 服務器發起域名解析請求;
    2.在獲取了對應的IP 後向服務器發送請求數據包;
    3.服務器接收到請求數據後查詢服務器上對應的頁面,並將找到的頁面代碼回覆給客戶端;
    4.客戶端接收到頁面源代碼後,檢查頁面代碼中引用的其餘資源,並再次向服務器請求該資源;
    5.在資源接收完成後,客戶端瀏覽器按照頁面代碼將頁面渲染輸出顯示在顯示器上;

  28. 對cookie 與session 的瞭解?他們能單獨用嗎?

    Session 採用的是在服務器端保持狀態的方案,而Cookie 採用的是在客戶端保持狀態的方案。但
    是禁用Cookie 就不能獲得Session。由於Session 是用Session ID 來肯定當前對話所對應的服務
    器Session,而Session ID 是經過Cookie 來傳遞的,禁用Cookie 至關於失去了SessionID,也
    就得不到Session。

  29. Django HTTP請求的處理流程?

    Django 和其餘Web 框架的HTTP 處理的流程大體相同,Django 處理一個Request 的過程
    是首先經過中間件,而後再經過默認的URL 方式進行的。咱們能夠在Middleware 這個地方把全部
    Request 攔截住,用咱們本身的方式完成處理之後直接返回Response。
    1. 加載配置
    Django 的配置都在「Project/settings.py」 中定義,能夠是Django 的配置,也能夠是自定義
    的配置,而且都經過django.conf.settings 訪問,很是方便。

    2. 啓動
    最核心動做的是經過django.core.management.commands.runfcgi 的Command 來啓動,
    它運行django.core.servers.fastcgi 中的runfastcgi,runfastcgi 使用了flup 的WSGIServer 來
    啓動fastcgi 。而WSGIServer 中攜帶了django.core.handlers.wsgi 的WSGIHandler 類的一個
    實例,經過WSGIHandler 來處理由Web 服務器(好比Apache,Lighttpd 等)傳過來的請求,此
    時纔是真正進入Django 的世界。

    3. 處理Request
    當有HTTP 請求來時,WSGIHandler 就開始工做了,它從BaseHandler 繼承而來。
    WSGIHandler 爲每一個請求建立一個WSGIRequest 實例,而WSGIRequest 是從
    http.HttpRequest 繼承而來。接下來就開始建立Response 了。
    4. 建立Response
    BaseHandler 的get_response 方法就是根據request 建立response,而具體生成
    response 的動做就是執行urls.py 中對應的view 函數了,這也是Django 能夠處理「友好URL 」
    的關鍵步驟,每一個這樣的函數都要返回一個Response 實例。此時通常的作法是經過loader 加載

    template 並生成頁面內容,其中重要的就是經過ORM 技術從數據庫中取出數據,並渲染到
    Template 中,從而生成具體的頁面了。
    5. 處理Response
    Django 返回Response 給flup,flup 就取出Response 的內容返回給Web 服務器,由後
    者返回給瀏覽器。
    總之,Django 在fastcgi 中主要作了兩件事:處理Request 和建立Response,而它們對應
    的核心就是「 urls 分析」、「模板技術」和「 ORM 技術」。

    如圖所示,一個HTTP 請求,首先被轉化成一個HttpRequest 對象,而後該對象被傳遞給
    Request 中間件處理,若是該中間件返回了Response,則直接傳遞給Response 中間件作收尾處理。
    不然的話Request 中間件將訪問URL 配置,肯定哪一個view 來處理,在肯定了哪一個view 要執行

    可是尚未執行該view 的時候,系統會把request 傳遞給view 中間件處理器進行處理,若是該中
    間件返回了Response,那麼該Response 直接被傳遞給Response 中間件進行後續處理,不然將執
    行肯定的view 函數處理並返回Response,在這個過程當中若是引起了異常並拋出,會被Exception
    中間件處理器進行處理。

  30. Django 裏QuerySet 的get 和filter 方法的區別?

    1) 輸入參數
    get 的參數只能是model 中定義的那些字段,只支持嚴格匹配。
    filter 的參數能夠是字段,也能夠是擴展的where 查詢關鍵字,如in,like 等

    2) 返回值
    get 返回值是一個定義的model 對象。
    filter 返回值是一個新的QuerySet 對象,而後能夠對QuerySet 在進行查詢返回新的QuerySet
    對象,支持鏈式操做,QuerySet 一個集合對象,可以使用迭代或者遍歷,切片等,可是不等於list 類型
    (使用必定要注意)。
    3) 異常
    get 只有一條記錄返回的時候才正常,也就說明get 的查詢字段必須是主鍵或者惟一約束的字段。
    當返回多條記錄或者是沒有找到記錄的時候都會拋出異常
    filter 有沒有匹配的記錄均可以

  31. django 中當一個用戶登陸A 應用服務器(進入登陸狀態),而後下次請求被nginx
    代理到B 應用服務器會出現什麼影響?

    若是用戶在A 應用服務器登錄的session 數據沒有共享到B 應用服務器,那麼以前的登陸狀態就沒
    有了。

  32. 跨域請求問題django 怎麼解決的?

     啓用中間件
     post 請求
     驗證碼
     表單中添加csrf_token 標籤

  33. Django 對數據查詢結果排序怎麼作,降序怎麼作,查詢大於某個字段怎麼作?

    排序使用order_by()
    降序須要在排序字段名前加-
    查詢字段大於某個值:使用filter(字段名_gt=值)

  34. Django 重定向你是如何實現的?用的什麼狀態碼?

     使用HttpResponseRedirect
     redirect 和reverse
     狀態碼:302,301

  35. 生成遷移文件和執行遷移文件的命令是什麼?

    python manage.py makemigrations
    python manage.py migrate

  36. 關係型數據庫的關係包括哪些類型?

     ForeignKey:一對多,將字段定義在多的一端中。
     ManyToManyField:多對對:將字段定義在兩端中。
     OneToOneField:一對一,將字段定義在任意一端中。

  37. 查詢集返回列表的過濾器有哪些?

     all() :返回全部的數據
     filter():返回知足條件的數據
     exclude():返回知足條件以外的數據,至關於sql 語句中where 部分的not 關鍵字
     order_by():排序

  38. 判斷查詢集正是否有數據?
    exists():判斷查詢集中否有數據,若是有則返回True,沒有則返回False。
  39. Django 自己提供了runserver,爲何不能用來部署?

    runserver 方法是調試Django 時常常用到的運行方式,它使用Django 自帶的WSGI Server 運
    行,主要在測試和開發中使用,而且runserver 開啓的方式也是單進程。

    uWSGI 是一個Web 服務器,它實現了WSGI 協議、uwsgi、http 等協議。注意uwsgi 是一種
    通訊協議,而uWSGI 是實現uwsgi 協議和WSGI 協議的Web 服務器。uWSGI 具備超快的性能、
    低內存佔用和多app 管理等優勢,而且搭配着Nginx 就是一個生產環境了,可以將用戶訪問請求與應
    用app 隔離開,實現真正的部署。相比來說,支持的併發量更高,方便管理多進程,發揮多核的優點,
    提高性能。

  40. apache 和nginx 的區別?

    Nginx 相對Apache 的優勢:
    輕量級,一樣起web 服務,比apache 佔用更少的內存及資源;
    抗併發,nginx 處理請求是異步非阻塞的,支持更多的併發鏈接,而apache 則是阻塞型的,在高
    併發下nginx 能保持低資源低消耗高性能;
    配置簡潔;
    高度模塊化的設計,編寫模塊相對簡單;
    社區活躍。
    Apache 相對Nginx 的優勢:
    rewrite ,比nginx 的rewrite 強大;
    模塊超多,基本想到的均可以找到;
    少bug ,nginx 的bug 相對較多;
    超穩定。

  41. varchar 與char 的區別?(2018-4-16-lxy)
    char 長度是固定的,無論你存儲的數據是多少他都會都固定的長度。而varchar 則處可變長度但他
    要在總長度上加1 字符,這個用來存儲位置。因此在處理速度上char 要比varchar 快速不少,可是對
    費存儲空間,因此對存儲不大,但在速度上有要求的可使用char 類型,反之能夠用varchar 類型。

  42. 查詢集兩大特性?惰性執行?

    惰性執行、緩存。
    建立查詢集不會訪問數據庫,直到調用數據時,纔會訪問數據庫,調用數據的狀況包括迭代、序列化、
    與if 合用

  43. git 經常使用命令? 

    git clone 克隆指定倉庫
    git status 查看當前倉庫狀態
    git diff 比較版本的區別
    git log 查看git 操做日誌
    git reset 回溯歷史版本
    git add 將文件添加到暫存區
    git commit 將文件提交到服務器
    git checkout 切換到指定分支
    git rm 刪除指定文件

  44. 電商網站庫存問題

    通常團購,秒殺,特價之類的活動,這樣會使訪問量激增,不少人搶購一個商品,做爲活動商品,
    庫存確定是頗有限的。控制庫存問題,數據庫的事務功能是控制庫存超賣的有效方式。
    1.在秒殺的狀況下,確定不能如此頻率的去讀寫數據庫,嚴重影響性能問題,必須使用緩存,將需
    要秒殺的商品放入緩存中,並使用鎖來處理併發狀況,先將商品數量增減(加鎖、解析)後在進行其餘
    方面的處理,處理失敗再將數據遞增(加鎖、解析),不然表示交易成功。
    2.這個確定不能直接操做數據庫的,會掛的。直接讀庫寫庫對數據庫壓力太大了,要用到緩存。
    3.首先,多用戶併發修改同一條記錄時,確定是後提交的用戶將覆蓋掉前者提交的結果了。這個直
    接可使用加樂觀鎖的機制去解決高併發的問題。

  45. HttpRequest 和HttpResponse 是什麼?幹嗎用的?

    HttpRequest 是django 接受用戶發送多來的請求報文後,將報文封裝到HttpRequest 對象中去。
    HttpResponse 返回的是一個應答的數據報文。render 內部已經封裝好了HttpResponse 類。
    視圖的第一個參數必須是HttpRequest 對象,兩點緣由:表面上說,他是處理web 請求的,因此
    必須是請求對象,根本上說,他是基於請求的一種web 框架,因此,必須是請求對象。
    由於view 處理的是一個request 對象,請求的全部屬性咱們均可以根據對象屬性的查看方法來獲
    取具體的信息:格式:request.屬性
    request.path 請求頁面的路徑,不包含域名
    request.get_full_path 獲取帶參數的路徑
    request.method 頁面的請求方式
    request.GET GET 請求方式的數據
    request.POST POST 請求方式的數據

    request.COOKIES 獲取cookie
    request.session 獲取session
    request.FILES 上傳圖片(請求頁面有enctype="multipart/form-data"屬性時FILES 纔有數據。

  46. 請求頭後面的?a=19  的鍵值對是怎麼產生的?
    鍵是開發人員在編寫代碼時肯定下來的,值是根據數據生成或者用戶填寫的,總之是不肯定的
  47. 403錯誤:

    403 錯誤:表示資源不可用,服務器理解客戶的請求,可是拒絕處理它,一般因爲服務器上文件和目錄
    的權限設置致使的web 訪問錯誤。如何解決:一、把中間件註釋。二、在表單內部添加{% scrf_token %}

  48. request.GET.get()取值時若是一鍵多值狀況?

    get 是覆蓋的方式獲取的。getlist()能夠獲取多個值。
    在一個有鍵無值的狀況下,該鍵名c 的值返回空。有鍵無值:c: getlist 返回的是列表,空列表
    在無鍵無值也沒有默認值的狀況下,返回的是None 無鍵無值:e:None

  49. HttpResponse 常見屬性,常見方法,應答對象?

    HttpResponse 常見屬性:
    content: 表示返回的內容
    charset: 表示response 採用的編碼字符集,默認是utf-8
    status_code:返回的HTTP 響應狀態碼3XX 是對請求繼續進一步處理,常見的是重定向。
    常見方法:
    init:建立httpResponse 對象完成返回內容的初始化
    set_cookie:設置Cookie 信息:格式:set_cookies('key','value',max_age=None,expires=None)
    max_age 是一個整數,表示指定秒數後過時,expires 指定過時時間,默認兩個星期後過時。
    write 向響應體中寫數據
    應答對象:
    方式一:render(request,"index.html") 返回一個模板
    render(request,"index.html", context) 返回一個攜帶動態數據的頁面

    方式二:render_to_response("index.html") 返回一個模板頁面
    方式三:redirect("/") 重定向
    方式四:HttpResponseRdeirect("/") 實現頁面跳轉功能
    方式五:HttpResponse("itcast1.0")在返回到額頁面中添加字符串內容
    方式六:HttpResponseJson() 返回的頁面中添加字符串內容。
    JsonResponse 建立對象時候接收字典做爲參數,返回的對象是一個json 對象。
    能接收Json 格式數據的場景,都須要使用view 的JsonResponse 對象返回一個json 格式數據
    ajax 的使用場景,頁面局部刷新功能。ajax 接收Json 格式的數據。
    在返回的應答報文中,能夠看到JsonResponse 應答的content-Type 內容是application/json
    ajax 實現網頁局部刷新功能:ajax 的get()方法獲取請求數據ajax 的each()方法遍歷輸出這些數據

  50. 什麼是反向解析?

    使用場景:模板中的超連接,視圖中的重定向
    使用:在定義url 時爲include 定義namespace 屬性,爲url 定義name 屬性
    在模板中使用url 標籤:{% url 'namespace_value:name_value'%}
    在視圖中使用reverse 函數:redirect(reverse('namespce_value:name_value’))
    根據正則表達式動態生成地址,減輕後期維護成本。
    注意反向解析傳參數,主要是在咱們的反向解析的規則後面天界了兩個參數,兩個參數之間使用空格隔
    開:<a href="{% url 'booktest:fan2' 2 3 %}">位置參數</a>

  51. ngo 日誌管理

    import logging
    logger=logging.getLogger(__name__) # 爲loggers 中定義的名稱
    logger.info("some info ...)
    可用函數有:logger.debug() logger.info() logger.warning() logger.error()
    Django 文件管理:對於jdango 老說,項目中的css,js,圖片都屬於靜態文件,咱們通常會將靜態
    文件放到一個單獨的目錄中,以方便管理,在html 頁面調用時,也須要指定靜態文件的路徑。靜態文
    件能夠放在項目根目錄下,也能夠放在應用的目錄下,因爲這些靜態文件在項目中是通用的,因此推薦
    放在項目的根目錄下。
    在生產中,只要和靜態文件相關的,全部訪問,基本上沒有django 什麼事,通常都是由nignx 軟
    件代勞了,爲何?由於nginx 就是幹這個的。

    

三.Tornado

1. Tornado 的核是什麼? (2018-4-16-lxy)Tornado 的核心是ioloop 和iostream 這兩個模塊,前者提供了一個高效的I/O 事件循環,後者則封裝了一個無阻塞的socket 。經過向ioloop 中添加網絡I/O 事件,利用無阻塞的socket ,再搭配相應的回調函數,即可達到求之不得的高效異步執行。

相關文章
相關標籤/搜索