• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django框架學習day01-初識

    1. 簡介

    Django 是用python語言寫的開源web開發框架,并遵循MVC設計。

    Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼復用,多個組件可以很方便的以"插件"形式服務于整個框架,Django有許多功能強大的第三方插件,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴展性。它還強調快速開發和DRY(DoNotRepeatYourself)原則。

    2. 特點

    1) 重量級框架

    對比Flask框架,Django原生提供了眾多的功能組件,讓開發更簡便快速。

    • 提供項目工程管理的自動化腳本工具
    • 數據庫ORM支持(對象關系映射,英語:Object Relational Mapping)
    • 模板
    • 表單
    • Admin管理站點
    • 文件管理
    • 認證權限
    • session機制
    • 緩存

    2)MVT模式

    有一種程序設計模式叫MVC,其核心思想是分工、解耦,讓不同的代碼塊之間降低耦合,增強代碼的可擴展性和可移植性,實現向后兼容。Django 的設計模式叫做MVT

    • M全拼為Model,與MVC中的M功能相同,負責和數據庫交互,進行數據處理。
    • V全拼為View,與MVC中的C功能相同,接收請求,進行業務處理,返回應答。
    • T全拼為Template,與MVC中的V功能相同,負責封裝構造要返回的html。

     

    3. Django工程搭建

    使用django 1.11.11版本,注意需要聯網

    pip install django==1.11.11

    創建工程的命令為:

    django-admin startproject 工程名稱

    創建的工程目錄結構:

    • 與項目同名的目錄,此處為demo。
    • settings.py 是項目的整體配置文件。
    • urls.py 是項目的URL配置文件。
    • wsgi.py 是項目與WSGI兼容的Web服務器入口。
    • manage.py 是項目管理文件,通過它管理項目。

    運行服務器命令如下:可以不寫IP和端口,默認IP是127.0.0.1,默認端口為8000

    python manage.py runserver ip:端口
    或:
    python manage.py runserver

    注:django默認工作在調式Debug模式下,如果增加、修改、刪除文件,服務器會自動重啟。按ctrl+c停止服務器。

    4. 創建子應用

    在Web應用中,通常有一些業務功能模塊是在不同的項目中都可以復用的,故在開發中通常將工程項目拆分為不同的子功能模塊,各功能模塊間可以保持相對的獨立,在其他工程項目中需要用到某個特定功能模塊時,可以將該模塊代碼整體復制過去,達到復用。在Flask框架中也有類似子功能應用模塊的概念,即藍圖Blueprint。在Django框架中叫做子應用。

    在django中,創建子應用模塊目錄仍然可以通過命令來操作,即:

    python manage.py startapp 子應用名稱

    子應用的目錄結構:

    • admin.py 文件跟網站的后臺管理站點配置相關。
    • apps.py 文件用于配置當前子應用的相關信息。
    • migrations 目錄用于存放數據庫遷移歷史文件。
    • models.py 文件用戶保存數據庫模型類。
    • tests.py 文件用于開發測試用例,編寫單元測試。
    • views.py 文件用于編寫Web應用視圖。

    注冊安裝一個子應用的方法,即是將子應用的配置信息文件apps.py中的Config類添加到INSTALLED_APPS列表中。

    'users.apps.UsersConfig'

    創建視圖:打開剛創建的users模塊,在views.py中編寫視圖代碼。

    from django.http import HttpResponse
    
    def index(request):
        """
        index視圖
        :param request: 包含了請求信息的請求對象
        :return: 響應對象
        """
        return HttpResponse("hello the world!")

    注:

    • 視圖函數的第一個傳入參數必須定義,用于接收Django構造的包含了請求數據的HttpReqeust對象,通常名為request
    • 視圖函數的返回值必須為一個響應對象,不能像Flask一樣直接返回一個字符串,可以將要返回的字符串數據放到一個HTTPResponse對象中。

    在子應用中新建一個urls.py文件用于保存該應用的路由;在users/urls.py文件中定義路由信息

    from django.conf.urls import url
    
    from . import views
    
    # urlpatterns是被django自動識別的路由列表變量
    urlpatterns = [
        # 每個路由信息都需要使用url函數來構造
        # url(路徑, 視圖)
        url(r'^index/$', views.index),
    ]

    在工程總路由demo/urls.py中添加子應用的路由數據

    from django.conf.urls import url, include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),  # django默認包含的
    
        # 添加
        url(r'^users/', include('users.urls')), 
    ]

    5. 配置文件、靜態文件

    5.1 BASE_DIR

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    當前工程的根目錄,Django會依此來定位工程內的相關文件,我們也可以使用該參數來構造文件路徑。

    注:abspath()# 這個表示絕對路徑; dirname()# 這個表示父路徑

    5.2 DEBUG

    調試模式,創建工程后初始值為True,即默認工作在調試模式下。

    作用:

    • 修改代碼文件,程序自動重啟

    • Django程序出現異常時,向前端顯示詳細的錯誤追蹤信息,而非調試模式下,僅返回Server Error (500)

    注意:部署線上運行的Django不要運行在調式模式下,記得修改DEBUG=False。

    5.3 本地語言與時區

    初始化的工程默認語言和時區為英語和UTC標準時區:

    LANGUAGE_CODE = 'en-us'  # 語言
    TIME_ZONE = 'UTC'  # 時區

    將語言和時區修改為中國大陸信息:

    LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'

    5.4 靜態文件

    為了提供靜態文件,需要配置兩個參數:

    • STATICFILES_DIRS 存放查找靜態文件的目錄
    • STATIC_URL 訪問靜態文件的URL前綴
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static_files'),
    ]

    注意:Django 僅在調試模式下(DEBUG=True)能對外提供靜態文件。當DEBUG=False工作在生產模式時,Django不再對外提供靜態文件,需要是用collectstatic命令來收集靜態文件并交由其他靜態文件服務器來提供。

    6. 路由說明

    6.1. 路由定義位置

    Django的主要路由信息定義在工程同名目錄下的urls.py文件中,該文件是Django解析路由的入口。

    每個子應用為了保持相對獨立,可以在各個子應用中定義屬于自己的urls.py來保存該應用的路由。然后用主路由文件包含各應用的子路由數據。

    6.2. 路由解析順序

    Django在接收到一個請求時,從主路由文件中的urlpatterns列表中以由上至下的順序查找對應路由規則,如果發現規則為include包含,則再進入被包含的urls中的urlpatterns列表由上至下進行查詢。

    值得關注的 由上至下 的順序,有可能會使上面的路由屏蔽掉下面的路由,帶來非預期結果。

    注: 需要注意定義路由的順序,避免出現屏蔽效應。

    6.3  路由命名

    在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。

    1) 在使用include函數定義路由時,可以使用namespace參數定義路由的命名空間,如:

    url(r'^users/', include('users.urls', namespace='users')),

    命名空間表示,凡是users.urls中定義的路由,均屬于namespace指明的users名下。

    命名空間的作用:避免不同應用中的路由使用了相同的名字發生沖突,使用命名空間區別開。

    2) 在定義普通路由時,可以使用name參數指明路由的名字,如:

    urlpatterns = [
        url(r'^index/$', views.index, name='index'),
        url(r'^say', views.say, name='say'),
    ]

    6.4 reverse反解析

    使用reverse函數,可以根據路由名稱,返回具體的路徑,如:

    from django.urls import reverse  # 注意導包路徑
    
    def index(request):
        return HttpResponse("hello the world!")
    
    def say(request):
        url = reverse('users:index')  # 返回 /users/index/
        print(url)
        return HttpResponse('say')
    • 對于未指明namespace的,reverse(路由name)
    • 對于指明namespace的,reverse(命名空間namespace:路由name)

    6.5 路徑結尾斜線/的說明

    Django中定義路由時,通常以斜線/結尾,其好處是用戶訪問不以斜線/結尾的相同路徑時,Django會把用戶重定向到以斜線/結尾的路徑上,而不會返回404不存在。用戶訪問 index 或者 index/ 網址,均能訪問到index視圖。

    注:雖然路由結尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設計理念。

    7. 請求

    HTTP協議向服務器傳參的四種形式:

    1. URL地址傳參. Users/1/hello.

    2. 查詢字符串. www.meiduo.site/index.py?name=hosnoodles&name1=crayfish

    3. 請求體傳參. body

    4. header頭.

    7.1.  URL路徑參數

    在定義路由URL時,可以使用正則表達式提取參數的方法從URL中獲取請求參數,Django會將提取的參數直接傳遞到視圖的傳入參數中。

    未命名參數按定義順序傳遞, 如

    # 在urls.py:
    url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
    
    # 在view.py:
    def weather(request, city, year):
        print('city=%s' % city)
        print('year=%s' % year)
        return HttpResponse('OK')

    命名參數按名字傳遞,如

    # 在urls.py:
    url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
    
    # 在views.py
    def weather(request, year, city):
        print('city=%s' % city)
        print('year=%s' % year)
        return HttpResponse('OK')

    7.2.  Django中的QueryDict對象

    定義在django.http.QueryDict

    HttpRequest對象的屬性GET、POST都是QueryDict類型的對象

    與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況

    方法get():根據鍵獲取值

    如果一個鍵同時擁有多個值將獲取最后一個值

    如果鍵不存在則返回None值,可以設置默認值進行后續處理

    方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值

    如果鍵不存在則返回空列表[],可以設置默認值進行后續處理

    # /weather/beijing/2018/?a=1&b=2&a=3
    def weather(request, city, year):
        print(year)
        print(city)
        # 查詢字符串參數
        a = request.GET.get('a')
        b = request.GET.get('b')
        alist = request.GET.getlist('a')
    
        print(a) # 3
        print(b) # 2
        print(alist) # [1, 3]

    7.3. 查詢字符串Query String

    獲取請求路徑中的查詢字符串參數(形如?k1=v1&k2=v2),可以通過request.GET屬性獲取,返回QueryDict對象。

    注:查詢字符串不區分請求方式,即假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字符串數據。

     

    7.4. 請求體

    請求體數據格式不固定,可以是表單類型字符串,可以是JSON字符串,可以是XML字符串,應區別對待。

    可以發送請求體數據的請求方式有POSTPUTPATCHDELETE

    7.4.1 表單類型 Form Data

    前端發送的表單類型的請求體數據,可以通過request.POST屬性獲取,返回QueryDict對象。

    def get_body(request):
        a = request.POST.get('a')
        b = request.POST.get('b')
        alist = request.POST.getlist('a')
        print(a)
        print(b)
        print(alist)
        return HttpResponse('OK')

    注:request.POST只能用來獲取POST方式的請求體表單數據。

    7.4.2 非表單類型 Non-Form Data

    非表單類型的請求體數據,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體數據,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes類型。

    import json
    
    def get_body_json(request):
        json_str = request.body
        json_str = json_str.decode()  # python3.6 無需執行此步
        req_data = json.loads(json_str)
        print(req_data['a'])
        print(req_data['b'])
        return HttpResponse('OK')

    7.5 請求頭

    可以通過request.META屬性獲取請求頭headers中的數據,request.META為字典類型

    常見的請求頭如:

    CONTENT_LENGTH – The length of the request body (as a string).
    CONTENT_TYPE – The MIME type of the request body.
    HTTP_ACCEPT – Acceptable content types for the response.
    HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
    HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
    HTTP_HOST – The HTTP Host header sent by the client.
    HTTP_REFERER – The referring page, if any.
    HTTP_USER_AGENT – The client’s user-agent string.
    QUERY_STRING – The query string, as a single (unparsed) string.
    REMOTE_ADDR – The IP address of the client.
    REMOTE_HOST – The hostname of the client.
    REMOTE_USER – The user authenticated by the Web server, if any.
    REQUEST_METHOD – A string such as "GET" or "POST".
    SERVER_NAME – The hostname of the server.
    SERVER_PORT – The port of the server (as a string).

    具體使用如:

    def get_headers(request):
        print(request.META['CONTENT_TYPE'])
        return HttpResponse('OK')

    7.6 其他常用HttpRequest對象屬性

    • method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
    • user:請求的用戶對象。
    • path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
    • encoding:一個字符串,表示提交的數據的編碼方式。
      • 如果為None則表示使用瀏覽器的默認設置,一般為utf-8。
      • 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
    • FILES:一個類似于字典的對象,包含所有的上傳文件

    8. 響應

    視圖在接收請求并處理后,必須返回HttpResponse對象或子對象。HttpRequest對象由Django創建,HttpResponse對象由開發人員創建。

    8.1 HttpResponse

    可以使用django.http.HttpResponse來構造響應對象。

    HttpResponse(content=響應體, content_type=響應體數據類型, status=狀態碼)

    也可通過HttpResponse對象屬性來設置響應體、狀態碼:

    • content:表示返回的內容。
    • status_code:返回的HTTP響應狀態碼。

    響應頭可以直接將HttpResponse對象當做字典進行響應頭鍵值對的設置:

    from django.http import HttpResponse
    
    def demo_view(request):
        # return HttpResponse('test python', status=400)
        # 或者
        response = HttpResponse('test python')
        response.status_code = 400
        response['Item'] = 'Python'
        return response

    8.2 HttpResponse子類

    Django提供了一系列HttpResponse的子類,可以快速設置狀態碼

    • HttpResponseRedirect 301
    • HttpResponsePermanentRedirect 302
    • HttpResponseNotModified 304
    • HttpResponseBadRequest 400
    • HttpResponseNotFound 404
    • HttpResponseForbidden 403
    • HttpResponseNotAllowed 405
    • HttpResponseGone 410
    • HttpResponseServerError 500

    8.3 JsonResponse

    若要返回json數據,可以使用JsonResponse來構造響應對象,作用:

    • 幫助我們將數據轉換為json字符串
    • 設置響應頭Content-Type為 application/json
    from django.http import JsonResponse
    
    def demo_view(request):
        return JsonResponse({'city': 'beijing', 'subject': 'python'})

    8.4 redirect重定向

    from django.shortcuts import redirect
    
    def demo_view(request):
        return redirect('/index.html')

    9. Cookie

    9.1 設置Cookie

    可以通過HttpResponse對象中的set_cookie方法來設置cookie。

    def demo_view(request):
        response = HttpResponse('ok')
        response.set_cookie('itcast1', 'python1')  # 臨時cookie
        response.set_cookie('itcast2', 'python2', max_age=3600)  # 有效期一小時
        return response

    9.2 讀取Cookie

    可以通過HttpRequest對象的COOKIES屬性來讀取本次請求攜帶的cookie值。request.COOKIES為字典類型

    def demo_view(request):
        cookie1 = request.COOKIES.get('itcast1')
        print(cookie1)
        return HttpResponse('OK')

    10. Session

    10.1 啟用Session

    Django項目默認啟用Session。

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',  # 默認開啟session ,注釋可關閉
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

    10.2 存儲方式

    在settings.py文件中,可以設置session數據的存儲方式,可以保存在數據庫、本地緩存等

    數據庫:存儲在數據庫中,如下設置可以寫,也可以不寫,這是默認存儲方式

    SESSION_ENGINE='django.contrib.sessions.backends.db'

    本地緩存:存儲在本機內存中,如果丟失則不能找回,比數據庫的方式讀寫更快。

    SESSION_ENGINE='django.contrib.sessions.backends.cache'

    混合存儲:優先從本機內存中存取,如果沒有則從數據庫中存取。

    SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

    10.3 Redis

    在redis中保存session,需要引入第三方擴展,我們可以使用django-redis來解決。

    1) 安裝擴展

    pip install django-redis

    2)配置

    在settings.py文件中做如下設置:

    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"

     

    版權聲明:本文為weixin_42225318原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_42225318/article/details/81269935

    智能推薦

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    猜你喜歡

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    精品国产乱码久久久久久蜜桃不卡