Python全棧開發【Django基礎】

Django 特色

強大的數據庫功能css

用python的類繼承,幾行代碼就能夠擁有一個豐富,動態的數據庫操做接口(API),若是須要你也能執行SQL語句html

自帶的強大的後臺功能前端

幾行簡單的代碼就讓你的網站擁有一個強大的後臺,輕鬆管理你的內容!python

優雅的網址jquery

用正則匹配網址,傳遞到對應函數,隨意定義,如你所想!nginx

模板系統web

強大,易擴展的模板系統,設計簡易,代碼,樣式分開設計,更容易管理。正則表達式

緩存系統shell

與memcached或其它的緩存系統聯用,更出色的表現,更快的加載速度。數據庫

國際化

徹底支持多語言應用,容許你定義翻譯的字符,輕鬆翻譯成不一樣國家的語言。

Django簡介

urls.py

網址入口,關聯到對應的views.py中的一個函數(或者generic類),訪問網址就對應一個函數。

views.py

處理用戶發出的請求,從urls.py中對應過來, 經過渲染templates中的網頁能夠將顯示內容,好比登錄後的用戶名,用戶請求的數據,輸出到網頁。

models.py

與數據庫操做相關,存入或讀取數據時用到這個,固然用不到數據庫的時候 你能夠不使用。

forms.py

表單,用戶在瀏覽器上輸入數據提交,對數據的驗證工做以及輸入框的生成等工做,固然你也能夠不使用。

templates 文件夾

views.py 中的函數渲染templates中的Html模板,獲得動態內容的網頁,固然能夠用緩存來提升速度。

admin.py

 

後臺,能夠用不多量的代碼就擁有一個強大的後臺。

settings.py

Django 的設置,配置文件,好比 DEBUG 的開關,靜態文件的位置等。

Django 基本命令

1. 新建一個 django project

django-admin.py startproject project-name
特別是在 windows 上,若是報錯,嘗試用 django-admin 代替 django-admin.py 試試

2. 新建 app

一個 project 爲一個項目,project-name 項目名稱,改爲你本身的,要符合Python 的變量命名規則(如下劃線或字母開頭)

python manage.py startapp app-name
或 django-admin.py startapp app-name

3. 同步數據庫

通常一個項目有多個app, 固然通用的app也能夠在多個項目中使用。

python manage.py syncdb
 
注意:Django 1.7.1及以上的版本須要用如下命令
python manage.py makemigrations
python manage.py migrate

備註:對已有的 models 進行修改,Django 1.7以前的版本的Django都是沒法自動更改表結構的,不過有第三方工具 south,詳見 Django 數據庫遷移 一節。這種方法能夠建立表,當你在models.py中新增了類時,運行它就能夠自動在數據庫中建立表了,不用手動建立。

4. 使用開發服務器

開發服務器,即開發時使用,通常修改代碼後會自動重啓,方便調試和開發,可是因爲性能問題,建議只用來測試,不要用在生產環境。

python manage.py runserver
 
# 當提示端口被佔用的時候,能夠用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(固然也能夠kill掉佔用端口的進程)
 
# 監聽全部可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址)
python manage.py runserver 0.0.0.0:8000
# 若是是外網或者局域網電腦上能夠用其它電腦查看開發服務器
# 訪問對應的 ip加端口,好比 http://172.16.20.2:8000

5. 清空數據庫

python manage.py flush

6. 建立超級管理員此命令會詢問是 yes 仍是 no, 選擇 yes 會把數據所有清空掉,只留下空表。

python manage.py createsuperuser
 
# 按照提示輸入用戶名和對應的密碼就行了郵箱能夠留空,用戶名和密碼必填
 
# 修改 用戶密碼能夠用:
python manage.py changepassword username

7. 導出數據 導入數據

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

關於數據操做 詳見:數據導入數據遷移,如今瞭解有這個用法就能夠了。

8. Django 項目環境終端

python manage.py shell

若是你安裝了 bpython 或 ipython 會自動用它們的界面,推薦安裝 bpython。

這個命令和 直接運行 python 或 bpython 進入 shell 的區別是:你能夠在這個 shell 裏面調用當前項目的 models.py 中的 API,對於操做數據,還有一些小測試很是方便。

9. 數據庫命令行

python manage.py dbshell

Django 會自動進入在settings.py中設置的數據庫,若是是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。

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

10. 更多命令

終端上輸入 python manage.py 能夠看到詳細的列表,在忘記子名稱的時候特別有用。

Django的配置文件(settings)

靜態文件設置:

1、概述:

     #靜態文件交由Web服務器處理,Django自己不處理靜態文件。簡單的處理邏輯以下(以nginx爲例):

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

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

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

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

    #一、在INSTALLED_APPS裏面加入'django.contrib.staticfiles',

    #二、在urls.py裏面加入
       if settings.DEBUG:  
           urlpatterns += patterns('', url(r'^media/(?P<path>.*)$', 
           'django.views.static.serve', {'document_root': settings.MEDIA_ROOT }),   
            url(r'^static/(?P<path>.*)$',
          'django.views.static.serve',{'document_root':settings.STATIC_ROOT}), )  

    # 三、這樣就能夠在開發階段直接使用靜態文件了。

2、MEDIA_ROOT和MEDIA_URL

        #而靜態文件的處理又包括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_URL}}abc/a.png">

        #    在部署階段最大的不一樣在於你必須讓web服務器來處理media文件,所以你必須在web服務器中配置,
        #  以便能讓web服務器能訪問media文件
        #    以nginx爲例,能夠在nginx.conf裏面這樣:

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

        #    具體能夠參考如何在nginx部署django的資料。

3、STATIC_ROOT和STATIC_URL、
    STATIC主要指的是如css,js,images這樣文件,在settings裏面能夠配置STATIC_ROOT和STATIC_URL,
    配置方式與MEDIA_ROOT是同樣的,可是要注意

    #STATIC文件通常保存在如下位置:

    #一、STATIC_ROOT:在settings裏面設置,通常用來放一些公共的js,css,images等。

    #二、app的static文件夾,在每一個app所在文夾都可以創建一個static文件夾,而後當運行collectstatic時,
    #    Django會遍歷INSTALL_APPS裏面全部app的static文件夾,將裏面全部的文件複製到STATIC_ROOT。所以,
    #   若是你要創建可複用的app,那麼你要將該app所須要的靜態文件放在static文件夾中。

    # 也就是說一個項目引用了不少app,那麼這個項目所須要的css,images等靜態文件是分散在各個app的static文件的,比
    #  較典型的是admin應用。當你要發佈時,須要將這些分散的static文件收集到一個地方就是STATIC_ROOT。

    #三、STATIC文件還能夠配置STATICFILES_DIRS,指定額外的靜態文件存儲位置。
    #  STATIC_URL的含義與MEDIA_URL相似。

    # ----------------------------------------------------------------------------
    #注意1:
        #爲了後端的更改不會影響前端的引入,避免形成前端大量修改

        STATIC_URL = '/static/'               #引用名
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"statics")  #實際名 ,即實際文件夾的名字
        )

        #django對引用名和實際名進行映射,引用時,只能按照引用名來,不能按實際名去找
        #<script src="/statics/jquery-3.1.1.js"></script>
        #------error-----不能直接用,必須用STATIC_URL = '/static/':
        #<script src="/static/jquery-3.1.1.js"></script>

    #注意2(statics文件夾寫在不一樣的app下,靜態文件的調用):

        STATIC_URL = '/static/'

        STATICFILES_DIRS=(
            ('hello',os.path.join(BASE_DIR,"app01","statics")) ,
        )

        #<script src="/static/hello/jquery-1.8.2.min.js"></script>

    #注意3:
        STATIC_URL = '/static/'
        {% load staticfiles %}
       # <script src={% static "jquery-1.8.2.min.js" %}></script>
View Code

其它重要參數設置:

複製代碼
APPEND_SLASH
       Default: True
       When set to True, if the request URL does not match any of the patterns in the URLconf and it 
doesn’t end in a slash, an HTTP redirect is issued to the same URL with a slash appended. Note
that the redirect may cause any data submitted in a POST request to be lost.

Django URL (路由系統)

     URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要爲該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。

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

參數說明:

  • 一個正則表達式字符串
  • 一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串
  • 可選的要傳遞給視圖函數的默認參數(字典形式)
  • 一個可選的name參數
from django.conf.urls import url
from django.contrib import admin

from app01 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})/$', views.year_archive),  #no_named group

    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),

]
#1   There’s no need to add a leading slash, because every URL has that. For
#    example, it’s ^articles, not ^/articles.

#2   A request to /articles/2005/03/ would match the third entry in the list.
#    Django would call the function views.month_archive(request, '2005', '03').

#3   /articles/2005/3/ would not match any URL patterns

#4   /articles/2003/ would match the first pattern in the list, not the second one

#5   /articles/2003/03/03/ would match the final pattern. Django would call the
#    functionviews.article_detail(request, '2003', '03', '03').
View Code

Including other URLconfs

#At any point, your urlpatterns can 「include」 other URLconf modules. This
#essentially 「roots」 a set of URLs below other ones.

#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:


from django.conf.urls import include, url

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

Django Views(視圖函數)

http請求中產生兩個核心對象:

        http請求:HttpRequest對象

        http響應:HttpResponse對象

所在位置:django.http

以前咱們用到的參數request就是HttpRequest    檢測方法:isinstance(request,HttpRequest)

1 HttpRequest對象的屬性和方法:

# path:       請求頁面的全路徑,不包括域名
#
# method:     請求中使用的HTTP方法的字符串表示。全大寫表示。例如
#
#                    if  req.method=="GET":
#
#                              do_something()
#
#                    elseif req.method=="POST":
#
#                              do_something_else()
#
# GET:         包含全部HTTP GET參數的類字典對象
#
# POST:       包含全部HTTP POST參數的類字典對象
#
#              服務器收到空的POST請求的狀況也是可能發生的,也就是說,表單form經過
#              HTTP POST方法提交請求,可是表單中可能沒有數據,所以不能使用
#              if req.POST來判斷是否使用了HTTP POST 方法;應該使用  if req.method=="POST"
#
#
#
# COOKIES:     包含全部cookies的標準Python字典對象;keys和values都是字符串。
#
# FILES:      包含全部上傳文件的類字典對象;FILES中的每個Key都是<input type="file" name="" />標籤中                     name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys:
#
#             filename:      上傳文件名,用字符串表示
#             content_type:   上傳文件的Content Type
#             content:       上傳文件的原始內容
#
#
# user:       是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前
#              沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。你
#              能夠經過user的is_authenticated()方法來辨別用戶是否登錄:
#              if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
#              時該屬性纔可用
#
# session:    惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中的session支持時該屬性纔可用。

#方法
get_full_path(),   好比:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()獲得的結果就是/index33/?name=123
req.path:/index33
View Code

注意一個經常使用方法:request.POST.getlist('')

2 HttpResponse對象:

  對於HttpRequest對象來講,是由django自動建立的,可是,HttpResponse對象就必須咱們本身建立。每一個view請求處理方法必須返回一個HttpResponse對象。

  HttpResponse類在django.http.HttpResponse

  在HttpResponse對象上擴展的經常使用方法:

頁面渲染:         render()(推薦)<br>                 render_to_response(),
頁面跳轉:         redirect("路徑")
locals():    能夠直接將函數中全部的變量傳給模板

 Template基礎 (模板語法)

一模版的組成

組成:HTML代碼+邏輯控制代碼

二 邏輯控制代碼的組成

1  變量(使用雙大括號來引用變量):

語法格式:       {{var_name}}
相關文章
相關標籤/搜索