1. 程式人生 > >Django <二>

Django <二>

mage 正則表達 文件的 userinfo 瀏覽器 pos port authent ica

Django URL(路由系統)

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

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

參數說明:

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

一、url無名分組之 url參數一

1、 url路由有優先級的

2、 在正則表達式中如果加上括號就是分組了,分組就是一個對象了,就需要一個變量來接收這個對象,這裏就是接收寫入的url

views文件視圖函數

技術分享
def special_case_2003(req):
    return HttpResponse("2003")
def month_archive(req,y,m):
    return HttpResponse(y+"year"+m+"mouth")
View Code

urls路由系統無名分組

技術分享
from django.conf.urls import url
from
django.contrib import admin from app01 import views urlpatterns = [ url(r^admin/, admin.site.urls), url(r"^cur_time/",views.cur_time), url(r"^userInfo/",views.userInfo), 1、#這個用戶連接http://127.0.0.1:8000/articles/2003/ 就能夠顯示視圖函數的內容 url(r^articles/2003/$, views.special_case_2003), 2、# http://127.0.0.1:8000/articles/正則匹配的/正則匹配的/ 就能夠顯示視圖函數
url(r^articles/([0-9]{4})/([0-9]{2})/$, views.month_archive), ]
View Code

1、上面用戶連接1這個鏈接,這個是絕對匹配,就會經過視圖函數返回2003

2、中的url由於分了兩個組,也就相當於對象,所以要在視圖函數中用變量來接收這個對象,並且在url中匹配。這裏返回給用戶輸入的連接加上year和mouth

二、url有名分組之 url參數二

The above example used simple, non-named regular-expression groups (via parenthesis) to capture bits of the URL and pass them as positional arguments to a view. In more advanced usage, it’s possible to use named regular-expression groups to capture URL bits and pass them as keyword arguments to a view.

In Python regular expressions, the syntax for named regular-expression groups is (?P<name>pattern), where name is the name of the group and pattern is some pattern to match.

Here’s the above example URLconf, rewritten to use named groups:

簡單說明補充:

re=re.search(‘(?P<id>\d{3})/(?P<name>\w{3})’,’wwee32tt123/ooo’ )

(?P<id>\d{3} 這裏就是把這個組命名為id

?P<name>\w{3} 這裏就是把這個組命名為name

print(re.group()) #123/ooo

print(re.goup(id)) #123

在urls中寫入:

技術分享
url(r"^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$",views.mouth)
View Code

然後在views中寫入視圖函數:

技術分享
def mouth(req,year,mouth):
    return HttpResponse(year+"year"+mouth+"mouth")
View Code

這裏的year就是匹配的urls中的路徑,mouth就是前面url中的路徑,這裏的year和mouth必須要和urls中的對應

訪問http://127.0.0.1:8000/articles/2003/43/

就能在前端出現 2003year43mouth

其實就是把url參數一的對象命名了而已

三、url參數三、

一、在urls中添加第三個參數

url(r"^index",views.index,{"name":"pyrene"})

然後在views中寫上視圖函數

def index(req,name):
    return HttpResponse(name)

註意:

這裏的視圖函數中必須把urls中的第三個參數的key傳入到這裏面,並且要和urls中的key的名字一模一樣

然後訪問index頁面就會返回給瀏覽器pyrene

二、如果在urls中的第三個參數前面有分組並且分組的組名和第三個參數的key相同,那麽用戶訪問瀏覽器的時候就會把覆蓋掉分組需要返回來的內容

技術分享
url(r"^index/(?P<name>[0-9]{4})/$",views.index,{"name":"pyrene"})
urls

views視圖函數不變

用戶訪問

http://127.0.0.1:8000/index/2000/

瀏覽器顯示:pyrene 而不是2000

原因是被後面的第三個參數覆蓋掉了

應用:

這裏的作用可以把幾個相同連接,然後加上第三個參數來返回不同的內容

四、url第四個參數

應用:防止修改跳轉form路徑,造成大量的復雜操作

小知識:

輸入form的時候點擊tab就會直接把form快捷鍵出來

urls文件,首先設置別名

url(r"^index/",views.index,name="pyrene")

在templates裏面添加login.html文件

技術分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#<form action="/index/" method="post">#}
<form action="{% url "pyrene" %}" method="post">
    <input type="text" name="username"/>
    <input type="password" name="pwd"/>
    <input type="submit" value="submit">
</form>

</body>
</html>
View Code

views視圖函數:

技術分享
def index(req):
    if req.method=="POST":
        username=req.POST.get("username",None)
        pwd=req.POST.get("pwd",None)
        if username=="aa"and pwd=="123":
            return HttpResponse("登錄成功")
    return render(req,"login.html")
View Code

然後用戶輸入http://127.0.0.1:8000/index/

輸入用戶名密碼,提交就能登錄成功

原因:

1、 首先在urls裏面設置了form跳轉的別名

2、 在login的前端文件中設置模板語言

3、 然後用戶點擊提交,前端模板語言就代表了urls的正則匹配的路徑,所以能跳轉找到views視圖函數

參數四的應用:

由於後端測試等需要更改前端與後端的路徑名字,所以這裏設置別名就不用更改前端的form跳轉的路徑。避免了復雜操作

url關於別名補充

1、這裏的別名是用戶連接的時候就已經在後臺替換了別名

五、url映射分發

應用背景:

由於一個大型網站有很多個頁面,成千上萬個,如果把這些頁面路由放到全局的urls裏面,那樣會造成很多麻煩,所以路由映射分發就出現了

思想:

利用分級的方式,首先在全局urls分發器中分別分發給下面不同功能層級進行urls選

用include

1、 在全局urls中操作 導入include,然後分發層級

技術分享
from django.conf.urls import url,include  #這裏導入include
from django.contrib import admin
from app01 import  views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r"^app01/",include("app01.urls")),]   #分發層級
View Code

2、 在app01這個項目功能中創建urls

技術分享
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.conf.urls import url,include
from django.contrib import admin
from app01 import  views
urlpatterns = [
    url(r"^new/story/$",views.introduce)
]
View Code

3、 在views視圖函數中寫入

技術分享
def introduce(req):
    return HttpResponse("ok")
View Code

用戶訪問http://127.0.0.1:8000/app01/new/story/

流程:首先在項目全局中設置include、urls分發,然後在下面功能中設置urls連接views視圖函數。

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():    可以直接將函數中所有的變量傳給模板

Django Models

數據庫的配置

1 django默認支持sqlite,mysql, oracle,postgresql數據庫。

<1> sqlite

django默認使用sqlite的數據庫,默認自帶sqlite的數據庫驅動 , 引擎名稱:django.db.backends.sqlite3

<2> mysql

引擎名稱:django.db.backends.mysql

2 mysql驅動程序

  • MySQLdb(mysql python)
  • mysqlclient
  • MySQL
  • PyMySQL(純python的mysql驅動程序)

3 在django的項目中會默認使用sqlite數據庫,在settings裏有如下設置:

技術分享

如果我們想要更改數據庫,需要修改如下:

技術分享

技術分享
DATABASES = {

    default: {

        ENGINE: django.db.backends.mysql, 

        NAME: books,    #你的數據庫名稱

        USER: root,   #你的數據庫用戶名

        PASSWORD: ‘‘, #你的數據庫密碼

        HOST: ‘‘, #你的數據庫主機,留空默認為localhost

        PORT: 3306, #你的數據庫端口

    }

}
View Code

NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建

USER和PASSWORD分別是數據庫的用戶名和密碼。

設置完後,再啟動我們的Django項目前,我們需要激活我們的mysql。

然後,啟動項目,會報錯:no module named MySQLdb

這是因為django默認你導入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL

所以,我們只需要找到項目名文件下的__init__,在裏面寫入:

import pymysql
pymysql.install_as_MySQLdb()

問題解決!

Django同步mysql操作

一、

技術分享

二、 為了更好的查詢修改數據庫如下操作:

技術分享

三、然後安裝mysql的驅動(driver),點擊ok

技術分享

四、點擊輸入mysql賬號密碼,點擊more可以查看其它的庫文件

技術分享

五、Django項目默認使用sqlite數據庫,讓其只是mysql需要在項目中的settings中如下設置

首先讓支持sqlite的設置註釋掉,然後添加上支持mysql的設置
# DATABASES = {
#     ‘default‘: {
#         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
#         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
#     }
# }


DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘a1‘,
        ‘USER‘:‘root‘,
        ‘PASSWORD‘:‘123456‘,
        ‘HOST‘:‘‘,
        ‘PORT‘:‘3306‘,
    }
}

註意點:

創建數據庫之後註冊APP,也就是把“部門”在最後加入,如下“app01”
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘app01‘,
]

說明:

詳細解釋:
DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘, 
        ‘NAME‘: ‘books‘,    #你的數據庫名稱
        ‘USER‘: ‘root‘,   #你的數據庫用戶名
        ‘PASSWORD‘: ‘‘, #你的數據庫密碼
        ‘HOST‘: ‘‘, #你的數據庫主機,留空默認為localhost
        ‘PORT‘: ‘3306‘, #你的數據庫端口
    }
}
註意點:
NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建

USER和PASSWORD分別是數據庫的用戶名和密碼。

設置完後,再啟動我們的Django項目前,我們需要激活我們的mysql。

然後,啟動項目,會報錯:no module named MySQLdb

這是因為django默認你導入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL

所以,我們只需要找到項目名文件下的__init__,在裏面寫入:

import pymysql
pymysql.install_as_MySQLdb()

問題解決!

MOdel連接數據庫之後還有更多操作,詳情請看下篇

Django <二>