Django基本配置與URLconf


what's the Django

  python的框架主要有:Django、Flask、Tornado

  Django是一個開放源代碼的Web應用框架,由Python寫成。它的主要特點是大而全,我們需要用到的關於Web框架的內容他幾乎都包括,我們只要稍作改動就可以完成一個比較復雜的項目。

Django最具代表性的就是它的MTV模型,分別代表:

    • models: 處理與數據庫相關的操作
    • template:模板語法--->將變量(數據庫數據)如何巧妙嵌入html頁面中
    • views:邏輯處理,主要用於后端的程序的編寫並將需要展現的數據發送到template

       此外,Django還有一個urls分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template,即起到路徑與視圖函數的映射關系的作用。

 

Django的基本生命周期如下圖所示

 

Django基本命令

 一、安裝Django
pip3 install django

  

二、創建Django項目
django namage.py startproject 項目名
#這里項目名取mysite,創建完后會得到對應文件夾
    #- mysite:項目名稱
         #- manage.py: 啟動文件,控制項目命令
         #- mysite   : 全局文件
                  #- __init__.py
                  #- settings.py:包含了項目的默認設置,包括數據庫信息,調試標志以及其他一些工作的變量
                  #- urls.py:路由信息,負責把URL模式映射到應用程序
                  #- wsgi.py

  

三、創建一個應用
python manage.py startapp 應用名

  

四、啟動項目
 
python manage.py runserver ip port    
#啟動起來后,我們輸入相應的IP和端口就可以訪問到網站了,例如我們的ip用的本機,端口是8080的話訪問的網址就輸入    http://127.0.0.1:8080/

#Django 啟動時報錯 UnicodeEncodeError ...通常是因為計算機名為中文,改成英文的計算機名重啟下電腦就可以了。

  

五、同步更改數據庫表或字段
'''
    python manage.py syncdb
    注意:Django 1.7.1 及以上的版本需要用以下命令
python manage.py makemigrations python manage.py migrate 這種方法可以創建表,當你在models.py中新增了類時,運行它就可以自動在數據庫中創建表了,不用手動創建。
'''

 

六、清空數據庫
python manage.py flush
#此命令會詢問是 yes 還是 no, 選擇 yes 會把數據全部清空掉,只留下空表。

 

七、創建超級管理員
'''
    python manage.py createsuperuser
     
    # 按照提示輸入用戶名和對應的密碼就好了郵箱可以留空,用戶名和密碼必填
     
    # 修改 用戶密碼可以用:
    python manage.py changepassword username
    
'''

 

八、Django項目環境終端
python manage.py shell
#Django 會自動進入在settings.py中設置的數據庫,如果是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。

#在這個終端可以執行數據庫的SQL語句。如果您對SQL比較熟悉,可能喜歡這種方式。

 

九、更多命令
python manage.py
# 查看所有的命令,忘記子名稱的時候特別有用。

 

靜態文件配置

概述:

     靜態文件交由Web服務器處理,Django本身不處理靜態文件。簡單的處理邏輯如下(以nginx為例):

              URI請求-----> 按照Web服務器里面的配置規則先處理,以nginx為例,主要求配置在nginx.
                             conf里的location

                         |---------->如果是靜態文件,則由nginx直接處理

                         |---------->如果不是則交由Django處理,Django根據urls.py里面的規則進行匹配

    以上是部署到Web服務器后的處理方式,為了便於開發,Django提供了在開發環境的對靜態文件的處理機制,方法是這樣:

 

靜態文件配置說明:

'''
        靜態文件的處理又包括STATIC和MEDIA兩類,這往往容易混淆,在Django里面是這樣定義的:
        
        MEDIA:指用戶上傳的文件,比如在Model里面的FileFIeld,ImageField上傳的文件。如果你定義
        
        MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上傳的文件就會被保存到c:\temp\media\abc

        eg:
            class blog(models.Model):
                   Title=models.charField(max_length=64)
                   Photo=models.ImageField(upload_to="photo")
          上傳的圖片就上傳到c:\temp\media\photo,而在模板中要顯示該文件,則在這樣寫
          在settings里面設置的MEDIA_ROOT必須是本地路徑的絕對路徑,一般是這樣寫:
                 BASE_DIR= os.path.abspath(os.path.dirname(__file__))
                 MEDIA_ROOT=os.path.join(BASE_DIR,'media/').replace('\\','/')

        MEDIA_URL是指從瀏覽器訪問時的地址前綴,舉個例子:
            MEDIA_ROOT=c:\temp\media\photo
            MEDIA_URL="/data/"
        在開發階段,media的處理由django處理:

           訪問http://localhost/data/abc/a.png就是訪問c:\temp\media\photo\abc\a.png

           在模板里面這樣寫<img src="/media/abc/a.png">

           在部署階段最大的不同在於你必須讓web服務器來處理media文件,因此你必須在web服務器中配置,
           以便能讓web服務器能訪問media文件
           以nginx為例,可以在nginx.conf里面這樣:

                 location ~/media/{
                       root/temp/
                       break;
                    }

           具體可以參考如何在nginx部署django的資料。
           
           
           '''
靜態文件配置說明

 

static配置:

  STATIC主要指的是如css,js,images這樣文件:

STATIC_URL = '/static/'      # 別名
STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"static"),  #實際名 ,即實際文件夾的名字
        )
'''
注意點1:
 django對引用名和實際名進行映射,引用時,只能按照引用名來,不能按實際名去找
        <script src="/statics/jquery-3.1.1.js"></script>
        ------error-----不能直接用實際名,必須用規定好的別名STATIC_URL = '/static/':
        <script src="/static/jquery-3.1.1.js"></script>

注意點2:
 STATICFILES_DIRS = (
    ("app01",os.path.join(BASE_DIR, "app01/statics")),
        )

 <script src="/static/app01/jquery.js"></script>

'''

 

media配置:

# in settings:

MEDIA_URL="/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload")

# in urls:
from django.views.static import serve
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

 

視圖層中urls.py的內容

  URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是建立起url與視圖函數的映射關系。我們就是以這種方式告訴Django,對於這個url要調用這段視圖函數的代碼,對於那個url該調用那段視圖函數的代碼。

'''
    urlpatterns = [
         url(正則表達式, views視圖函數,參數,別名),
]


參數說明:

    一個正則表達式字符串
    一個可調用對象,通常為一個視圖函數(html頁面)或一個指定視圖函數路徑的字符串
    可選的要傳遞給視圖函數的默認參數(字典形式)
    一個可選的name參數

    '''

 URLconf的正則字符串參數

 一、基本配置

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

 '''
    如果url出現覆蓋現象的情況,匹配第一個url
    1 一旦匹配成功則不再繼續往下
    2 若要從URL 中捕獲一個值進行傳值,只需要在它周圍放置一對圓括號。
    3 最前面不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。
    4 每個正則表達式前面的'r'和最后的'$' 是可選的但是建議加上。

一些請求的例子:

    /articles/2005/3/ 不匹配上述任何URL,因為列表中的第三個模式要求月份應該是兩個數字。
    /articles/2003/ 將匹配列表中的第一個模式而不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。
    /articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將調用函數
                       views.month_archive(request, '2005', '03')。
    '''
#設置項是否開啟URL訪問地址后面不為/跳轉至帶有/的路徑
APPEND_SLASH=True
flash

  

二、正則的有名分組(named group)

  上面的示例使用簡單的、沒有命名的正則表達式組(通過圓括號)來捕獲URL 中的值並以位置參數傳遞給視圖函數。在更高級的用法中,可以使用命名的正則表達式組來捕獲URL 中的值並以關鍵字參數傳遞給視圖。

  在Python 正則表達式中,命名正則表達式組的語法是(?p<name>pattern),其中name是組的名稱,pattern是要匹配的模式。

下面是以上URLconf 使用命名組的重寫:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

'''
這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字參數而不是位置參數傳遞給視圖函數。例如:

    /articles/2005/03/    
    請求將調用views.month_archive(request, year='2005', month='03')函數
    /articles/2003/03/03/ 
    請求將調用函數views.article_detail(request, year='2003', month='03', day='03')。
在實際應用中,這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤 —— 你可以在你的視圖函數定義中重新安排參數的順序。
當然,這些好處是以簡潔為代價;有些開發人員認為命名組語法丑陋而繁瑣。
'''

 

三、URLconf 

  URLconf 在請求的URL 上查找,將它當做一個普通的Python 字符串。不包括GET和POST參數以及域名。

  例如,http://www.example.com/myapp/ 請求中,URLconf 將查找/myapp/。

  在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找/myapp/。

  URLconf 不檢查請求的方法。換句話講,所有的請求方法 —— 同一個URL的POST、GET、HEAD等等 —— 都將路由到相同的函數。

URLconf 捕獲的參數永遠是字符串

  每個捕獲的參數都作為一個普通的Python 字符串傳遞給視圖,無論正則表達式使用的是什么匹配方式。例如,下面這行URLconf 中:views.year_archive 的year 參數將是一個字符串

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

 

指定視圖函數的參數可以設置一個默認值。 下面是一個URLconf 和視圖的示例:

# URLconf
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]

# View (in blog/views.py)
def page(request, num="1"):

    ...
'''
在上面的例子中,兩個URL模式指向同一個視圖views.page —— 但是第一個模式不會從URL 中捕獲任何值。
如果第一個模式匹配,page() 函數將使用num參數的默認值"1"。如果第二個模式匹配,page() 將使用正則表達式捕獲的num 值。
'''

 

四、路由分發:起到解耦作用

from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),
]

  這樣做的作用是防止因為耦合性過高,使得其中一行代碼出錯時整個程序崩潰,影響到其他功能的使用。解耦后,若有一個app出現故障,其余功能不受影響,仍可繼續使用,也方便修復

 

傳遞額外的選項給視圖函數(了解)

  URLconfs 具有一個鈎子,函數可以接收一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。

例如:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

  在這個例子中,對於/blog/2005的請求,Django 將調用views.year_archive(request,year='2005',foo='bar')

  這個技術在Syndication 框架中使用較多,來傳遞元數據和選項給視圖。

 

URL 的反向解析

  在使用Django 項目時,一個常見的需求是獲得URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。

  人們強烈希望不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。

  換句話講,需要的是一個DRY 機制。除了其它有點,它還允許設計的URL 可以自動更新而不用遍歷項目的源代碼來搜索並替換過期的URL。

  獲取一個URL 最開始想到的信息是處理它視圖的標識(例如名字),查找正確的URL 的其它必要的信息有視圖參數的類型(位置參數、關鍵字參數)和值。

  Django 提供一個辦法是讓URL 映射是URL 設計唯一的地方。你填充你的URLconf,然后可以雙向使用它:

    •   根據用戶/瀏覽器發起的URL 請求,它調用正確的Django 視圖,並從URL 中提取它的參數需要的值。
    •   根據Django 視圖的標識和將要傳遞給它的參數的值,獲取與之關聯的URL。

  第一種方式是我們在前面的章節中一直討論的用法。第二種方式叫做反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查。

  在需要URL 的地方,對於不同層級,Django 提供不同的工具用於URL 反查:

    •   在模板中:使用url 模板標簽。
    •   在Python 代碼中:使用django.core.urlresolvers.reverse()函數。
    •   在更高層的與處理Django 模型實例相關的代碼中:使用get_absolute_url()方法。

例子:

考慮下面的URLconf:

from django.conf.urls import url

from . import views

urlpatterns = [
    #...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
]

根據這里的設計,某一年nnnn對應的歸檔的URL是/articles/nnnn/。

你可以在模板的代碼中使用下面的方法獲得它們:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

 

在Python后端的代碼中,這樣使用:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

如果出於某種原因決定按年歸檔文章發布的URL應該調整一下,那么你將只需要修改URLconf 中的內容。

在某些場景中,一個視圖是通用的,所以在URL 和視圖之間存在多對一的關系。對於這些情況,當反查URL 時,只有視圖的名字還不夠。

 

命名URL 模式

  為了完成上面例子中的URL 反查,將需要使用命名的URL 模式。URL 的名稱使用的字符串可以包含任何你喜歡的字符。不只限制在合法的Python 名稱。

  當命名URL 模式時,請確保使用的名稱不會與其它應用中名稱沖突。如果你的URL 模式叫做comment,而另外一個應用中也有一個同樣的名稱,當你在模板中使用這個名稱的時候不能保證將插入哪個URL。

  在URL 名稱中加上一個前綴,比如應用的名稱,將減少沖突的可能。我們建議使用myapp-comment而不是comment。

 

 

 

 

 

              


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM