Python基礎(Django)

  • 2020 年 1 月 10 日
  • 筆記

介紹Django之前,先來明確幾個基礎概念:

1、什麼是Web框架?

    Web框架其實是建立web應用的一種方式,它為應用程式提供一套程式框架,這樣開發者可以專註於編寫清晰、易維護的程式碼,而無需從頭做起。

    他們基本上都以相同的方式工作的:

    1、接收HTTP請求

    2、根據請求分派處理其的程式碼

    3、通過程式碼產生HTML頁面

    4、創建帶有內容的HTTP響應

2、什麼是MVC和MTV?

    MVC:其實就是Models(模型)、Views(視圖)、Controller(控制器)的簡稱。

      模型:用來維護數據和定義數據的訪問方法

      視圖:用於數據的展示,也可以稱為用戶介面

      控制器:用於處理用戶請求邏輯,先調用模型獲取數據,再調用視圖展示數據。

    MTV:其實是Models(模型)、Templates(模板)、Views(視圖)的簡稱。

       模型:用來維護數據和定義數據的訪問方法

      模板:用於數據的展示,對應MVC模式中的Views

      視圖:用於指定某一特定URL的回調函數,描述了所要展現的數據,具體的展現交給模板

關於Django

Django前世今生就不做介紹,只說一點,它是MTV模式的。直接開始介紹使用(Tips:以下介紹中應用和app兩個詞表示的都是項目下的應用):

1、安裝

 官方下載:https://www.djangoproject.com/download/

 推薦直接pip安裝:pip install Django==1.9.4

2、配置settings.py

 2-1、區分測試環境和生產環境:   

    import socket

    if socket.gethostname() == 'Test-Hostname':

        #測試環境的一些配置,比如DATABASES配置,DEBUG開啟情況等

    else:

        #生產環境的配置

 2-2、設置允許訪問此項目的主機列表

    ALLOWED_HOSTS = ['*'] # *表示允許所有

 2-3、註冊應用,這個操作一般是在創建應用之後才會用到。 

    INSTALLED_APPS = ('應用名稱',)

 2-4、關閉CSRF(跨站請求偽造)防禦,此操作適用於不太了解CSRF的同學,若不關閉,前端將不能POST提交數據到後台。關閉方法為找到此配置項然後注釋掉即可。

    MIDDLEWARE_CLASSES = (#'django.middleware.csrf.CsrfViewMiddleware',)

 2-5、配置靜態資源的目錄(js、css、img等資源),需要增加配置,然後在項目目錄下新建相應的目錄即可。

    STATICFILES_DIRS = (         os.path.join(BASE_DIR,'static'),

    )

 2-6、配置模板文件目錄(html文件),需要增加配置,然後在項目目錄下新建相應的目錄即可。(1.9版本的django默認已配置)  

    TEMPLATE_DIRS = (

        os.path.join(BASE_DIR,  'templates'),

    )

 2-7、關於session的配置    

    SESSION_EXPIRE_AT_BROWSER_CLOSE = True    #關閉瀏覽器時session自動過期

    SESSION_COOKIE_AGE = 60*120         #設置瀏覽器cookie過期時間,60秒*120  

3、使用:步驟大概分為:創建項目、創建應用、配置規則

    常用命令:      

    django-admin.py startproject project_name    #創建項目

    python manage.py startapp app_name        #在項目中創建應用

    python manage.py syncdb              #創建(同步)資料庫(Django1.9中已棄用)

    python manage.py makemigrations          

    python manage.py migrate             #這兩條命令效果等於syncdb

    python manage.py createsuperuser          #創建管理員賬戶

   python manage.py runserver 0.0.0.0:8000      #啟動服務,綁定IP:PORT

    3-1、創建項目:

        3-1-1、手動創建一個目錄,如:mkdir /project

        3-1-2、進入該目錄創建一個項目,執行django-admin.py startproject 項目名稱

            如:django-admin.py startproject P1

    3-2、創建應用:

        3-2-1、進入項目目錄,如:cd /project/P1

        3-2-2、執行django-admin.py startapp 應用名稱 

            如:django-admin.py startapp app01

    3-3、配置規則:

        3-3-1、修改項目的urls.py,定義URL訪問規則(路由規則)

        3-3-2、修改應用的views.py,定義URL的回調函數

     3-4、啟動django

 Django具體各個部分的配置和使用請繼續往下看。

Django的配置

一、Django路由系統

  說明:Django中每一個請求的url必須有一個相應的函數來處理,當請求到達時會根據urls.py文件配置的規則從上往下匹配,匹配一條則不再往下匹配。

  配置文件:urls.py

  配置方式:

    1、靜態路由:一個url對應一個views中的函數。

        例:url(r'^index/$', views.index),

    2、動態路由:多個url對應一個views中的函數,此處的url多為正則匹配。

        例:url(r'^index/(.*)/$', views.index),

    3、默認路由:當此條規則之上的所有規則都沒有匹配上的時候,它會最終匹配所有。一般用於處理請求地址不存在的情況。

        例:url(r'.*', views.warn),

    4、分類路由:當一個項目有多個app的時候,根據不同的app對路由規則進行一次分類。那個app的請求就由那個app的urls來處理。

        例:url(r'^app01/',include('app01.urls')), #將所有以app01/開頭的url請求交給app01目錄下的urls.py來處理。

       實現分類路由需要事先做兩個操作:

        1、在應用目錄(app01)下新建一個urls.py文件。可以直接把項目下的urls.py拷貝過去,然後手動修改內容,在這裡面配置的就是app01應用的所有路由規則。

        2、修改項目目錄下的urls.py文件,首先導入include方法(from django.conf.urls import include),然後配置路由分類規則,多個應用則重複這兩步操作。

二、Django中間件

  說明:django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中間件中相應的方法。

  配置文件:settings.py

  配置方式:

    MIDDLEWARE_CLASSES = (這裡面配置的都是中間件)

  中間件可以自定義,自定義的意義在於可以在每個請求達到或返回的時候做出一些自定義的處理操作。比如日誌記錄、IP限制等。

  但是,這裡不做描述。

三、Django快取

  說明:快取的意義就是快取(聽上去好像是廢話,不過Django的快取功能不常用)。

  1、配置(settings.py中加入)

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',#使用文件快取

        'LOCATION': os.path.join(BASE_DIR, 'cache'),    #文件名為cache

        'TIMEOUT': 600,    #快取超時時間為600秒

        'OPTIONS': {

            'MAX_ENTRIES': 1000    #最大快取條目數為1000

        }

    }

} 

  2、應用

from django.shortcuts import render, HttpResponse

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)    #以裝飾器的形式配置,在哪個函數上面,就快取哪個函數return的數據

def func(request):

    return HttpResponse('xxx')

四、cookie和session

   說明:cookie是一個字元串,保存於客戶端(瀏覽器)本地(根據cookie類型的不同可保存在記憶體,也可保存在硬碟)。

      session保存在伺服器端,存儲與客戶端會話的所有資訊。

   在Django中的用處:

    1、用於判斷用戶是否已登錄

    2、根據不同的用戶返回不同的內容

   工作原理:

    當客戶端(瀏覽器)訪問伺服器時,伺服器會為本次會話創建一個Seesion,同時生成一個唯一的SessionID,用該SessionID為標識符來存取伺服器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,也就是保存在Cookie中,用戶提交請求時,會同時將這一SessionID提交到伺服器端,來存取Session數據。這一過程,是不用開發人員干預的。所以一旦客戶端禁用Cookie,那麼Session也會失效。

   用法:

    1、request.session['username'] = username    #往session中存儲一個值(key,value的方式存儲)

     2、request.session.get('username')    #根據key從session中獲取一個值

     3、del request.session['username']    #根據key從session中刪除一個值

五、模板

 說明:Django中的模板其實就是一個嵌套著各種模板標籤的html頁面。模板也有自己的語言,語言在模板中以模板標籤的形式存在。當用戶訪問一個頁面的時候,Django會讀取views中定義的模板,然後將Model中獲取的數據插入到模板中,最後將渲染完成的頁面返回給用戶。

 使用:

    一、模板語言

     1、變數

     {{ 變數名 }}    #兩個大括弧中定義的是一個變數,變數的值一般是由後台views中以同樣的名稱來返回賦值。

      2、for循環

      {% for item in item_list %}    #item_list是一個列表,值是由後台views中以同樣的名稱來返回賦值。

        <p>` item `</p>

      {% endfor %}

     3、if判斷

      {% if ordered_warranty %}      #ordered_warranty是一個變數,值是由後台views中以同樣的名稱來返回賦值。

           html code

       {% else %} 

          html code

       {% endif %}

     4、模板繼承:當多個頁面需要使用同樣的主題樣式,只是局部內容不一樣時,可以使用模板的繼承特性。

      母板:{% block title %}    #title是自定義的一個block名稱

         這中間是不希望被繼承的html code

        {% endblock %}

      子板:{% extends "base.html" %}  #在子板頁面的最頂部配置,base.html是母板的名稱

        {% block title %}    #title是母板中定義的block名稱

           這中間是不繼承於母版 而是自己自定義的html code

           {% endblock %}

      另類繼承方法:{% include 'some.html' %}   #將some.html中的所有內容載入到當前標籤的位置 

  二、自定義simple_tag(需要在settings.py註冊當前app,不然django無法找到自定義的simple_tag)

    1、在app中創建templatetags模組

    2、在templatetags模組中創建tag.py (tag為自定義的名稱)

#!/usr/bin/env python  # -*- coding:utf-8 -*-    from django import template  from django.utils.safestring import mark_safe  from django.template.base import resolve_variable,Node,TemplateSyntaxError    register = template.Library()    @register.simple_tag  def my_simple_time(v1,v2,v3):          return v1+v2+v3    @register.simple_tag  def my_input(id,arg):      result = "<input type='text', id='%s' class='%s'>"%(id,arg,)      return mark_safe(result)

   3、在html中導入之前創建的tag.py(注意導入時文件名不要加.py)  

{% load tag %}

   4、使用simple_tag,根據tag.py中定義的函數的要求傳入參數

{% my_simple_time 1 2 3 %}  {% my_input 'id' 'hide' %}

   5、完整的html例子

{% load tag %}  <!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <title></title>  </head>  <body>      <h1>{{ name }}</h1>      {% my_simple_time 1 2 3 %}      {% my_input 'id' 'hide' %}  </body>  </html>

  三、模板的執行  

from django.shortcuts import render,HttpResponse  def index(request):      item_list2 = ['a','b','c']      return render(request,'index.html',{'item_list':item_list2})      #index.html是模板文件,'item_list'是模板文件中定義的變數名稱,item_list2是變數的賦值,如果有多個變數需要賦值,則用,逗號隔開,(以字典的形式來給前端頁面的變數賦值)。     def warn(request):       HttpResponse('Page not found')    #直接返回一個字元串

六、Form和Model

   由於這倆哥們內容比較多同時非常重要,將另起一篇博文來介紹。

部落格的部分內容和思路整理自武沛齊的部落格。

Tags: