Django基礎

来源:http://www.cnblogs.com/jl-bai/archive/2016/09/16/5798213.html
-Advertisement-
Play Games

一、創建django程式 終端命令:django-admin startproject sitename IDE創建Django程式時,本質上都是自動執行上述命令 其他常用命令: python manage.py runserver 0.0.0.0 #創建APP python manage.py s ...


一、創建django程式

  • 終端命令:django-admin startproject sitename
  • IDE創建Django程式時,本質上都是自動執行上述命令
其他常用命令:      python manage.py runserver 0.0.0.0   #創建APP   python manage.py startapp appname   python manage.py syncdb   #創建表命令   python manage.py makemigrations   python manage.py migrate   #創建超級管理員   python manage.py createsuperuser 查看django版本   django.VERSION

二.配置文件

  1、資料庫
DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}
# 由於Django內部連接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,所以需要使用pymysql來代替
  
# 如下設置放置的與project同名的配置的 __init__.py文件中
  
import pymysql
pymysql.install_as_MySQLdb()
View Code

2、模版

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

3、靜態文件

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

三.路由系統 

1.基礎的url映射

每個路由規則對應一個view中的函數

from django.conf.urls import include, url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$', views.index),
 ]

1.先從創建的app下的views.py面定義處理數據的函數

2.在urls.py里導入views

3.在urlpatterns里寫入一條url與處理函數的l映射關係

4.url映射一般是一條正則表達式,“^” 字元串的開始,“$“ 字元串的結束

5.當寫成”^$“時,不輸入任何url時不會在返回黃頁,而是返回後面函數里對應的頁面。一般這一條會寫在url的最後

如:

url(r'^$', views.index),

2.動態路由映射

url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),
  • 請求manage/index/1 需要 views.manage(request,name="index",id=1)
import re

ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo')

print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
正則知識
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),
]

3.根據app對路由規則進行一次分類

url(r'^web/',include('web.urls')),

django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射,從而是路由系統變得簡潔

四.模板

1.模版的執行

模版的創建過程,對於模版,其實就是讀取模版(其中嵌套著模版標簽),然後將 Model 中獲取的數據插入到模版中,最後將信息返回給用戶

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
View Code
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)
View Code
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime
 
def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)
View Code
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
View Code

2.模板語言

詳參

http://www.cnblogs.com/jl-bai/p/5843322.html

五.django視圖

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支持時該屬性才可用。
View Code

HttpRequest對象的方法:get_full_path(),   比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的結果就是/index33/?name=123

2 HttpResponse對象:

   對於HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象。

  HttpResponse類在django.http.HttpResponse

  在HttpResponse對象上擴展的常用方法:頁面渲染:render,render_to_response,

                                                        頁面跳轉:redirect

                                                        locals:   可以直接將函數中所有的變數傳給模板    

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 style="color:blue">hello world</h1>
    <h1 style="color:blue">{{name}}</h1>
</body>
</html>
View Code

六.model

到目前為止,當我們的程式涉及到資料庫相關操作時,我們一般都會這麼搞:

  • 創建資料庫,設計表結構和欄位
  • 使用 MySQLdb 來連接資料庫,並編寫數據訪問層代碼
  • 業務邏輯層去調用數據訪問層執行資料庫操作
import MySQLdb
 
def GetList(sql):
    db = MySQLdb.connect(user='root', db='db1', passwd='1234', host='localhost')
    cursor = db.cursor()
    cursor.execute(sql)
    data = cursor.fetchall()
    db.close()
    return data
 
def GetSingle(sql):
    db = MySQLdb.connect(user='root', db='db1', passwd='1234', host='localhost')
    cursor = db.cursor()
    cursor.execute(sql)
    data = cursor.fetchone()
    db.close()
    return data
View Code

django為使用一種新的方式,即:關係對象映射(Object Relational Mapping,簡稱ORM)。

  PHP:activerecord

  Java:Hibernate 

    C#:Entity Framework

django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動生成資料庫表

詳細見:

http://www.cnblogs.com/jl-bai/p/5798860.html

七.中間件

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

在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變數,其中每一個元素就是一個中間件,如下圖。

 

與mange.py在同一目錄下的文件夾 wupeiqi/middleware下的auth.py文件中的Authentication類

中間件中可以定義四個方法,分別是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

以上方法的返回值可以是None和HttpResonse對象,如果是None,則繼續按照django定義的規則向下執行,如果是HttpResonse對象,則直接將該對象返回給用戶

八.自定義中間件

1.創建中間件類

class RequestExeute(object):
      
    def process_request(self,request):
        pass
    def process_view(self, request, callback, callback_args, callback_kwargs):
        i =1
        pass
    def process_exception(self, request, exception):
        pass
      
    def process_response(self, request, response):
        return response

2、註冊中間件

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'wupeiqi.middleware.auth.RequestExeute',
)

九.Admin

django amdin是django提供的一個後臺管理頁面,改管理頁面提供完善的html和css,使得你在通過Model創建完資料庫表之後,就可以對數據進行增刪改查,而使用django admin 則需要以下步驟:

  • 創建後臺管理員
  • 配置url
  • 註冊和配置django admin後臺管理頁面

1.創建後臺管理員

python manage.py createsuperuser

2.配置後臺管理url

url(r'^admin/', include(admin.site.urls))

3.註冊和配置django admin 後臺管理頁面

  a.在admin中執行如下配置

from django.contrib import admin
  
from app01 import  models
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)

b.設置數據表名稱

class UserType(models.Model):
    name = models.CharField(max_length=50)
  
    class Meta:
        verbose_name = '用戶類型'
        verbose_name_plural = '用戶類型'
View Code

c.打開表之後,設定預設顯示,需要在model中作如下配置

class UserType(models.Model):
    name = models.CharField(max_length=50)
  
    def __unicode__(self):
        return self.name
View Code
from django.contrib import admin
  
from app01 import  models
  
class UserInfoAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'email')
  
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code

d.為數據表添加搜索功能

from django.contrib import admin
  
from app01 import  models
  
class UserInfoAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'email')
    search_fields = ('username', 'email')
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code

e.添加快速過濾

from django.contrib import admin
  
from app01 import  models
  
class UserInfoAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'email')
    search_fields = ('username', 'email')
    list_filter = ('username', 'email')
      
  
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 利用django的Q()功能可以很好的展開搜索功能 假設我要做個這樣的搜索功能 那麼思路是怎麼樣的? 那我們就來看看代碼 前端的代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title ...
  • 今天看到園友心白水撰寫的《簡單翻譯工具--必應字典第三方API使用方法》,感覺很不錯,所以用Python也寫了一個。源碼如下: 程式運行的結果如下: 請輸入英文單詞: python美音:[ 'paɪθɑn ] 英音:[ 'paɪθ(ə)n ] n. 蟒;蚺蛇Web 蟒蛇;巨蟒;派森 例句en: Se ...
  • 分類 分類可以模塊化方法的定義,可以用於向現有的類添加新的方法。 分類提供了一種簡單的方式,用他可以將類的定義模塊化到相關方法的組或分類中。它還提供了拓展現有類定義的簡便方式,並且不必訪問類的源代碼,也無需創建子類。 分類可以通過兩種方法來實現: 1.繼承自一個分類:可以通過將分類名稱括在類名稱之後 ...
  • 題目鏈接 http://vjudge.net/contest/132391#problem/G Description standard input/outputStatements — It' s a good game, — Princess said pensively. It was cle ...
  • 題目 輸入 第一行包含兩個整數N、M。N表示路口的個數,M表示道路條數。接下來M行,每行兩個整數,這兩個整數都在1到N之間,第i+1行的兩個整數表示第i條道路的起點和終點的路口編號。接下來N行,每行一個整數,按順序表示每個路口處的ATM機中的錢數。接下來一行包含兩個整數S、P,S表示市中心的編號,也 ...
  • 主要藉助這道比較裸的題來講一下tarjan這種演算法 tarjan是一種求解有向圖強連通分量的線性時間的演算法。(用dfs來實現) 如果兩個頂點可以相互通達,則稱兩個頂點強連通。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。 在上面這張有向圖中1,2,3, ...
  • Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest l ...
  • (一)數組的創建 數組的創建包括兩部分:數組的申明與分配記憶體空間。 數組的申明還有另外一種方式: 通常,在寫代碼時,為了方便,我們將兩行合併為一行: (二)傳遞參數 由於初學java,這裡只討論值傳遞,不考慮地址傳遞。主要有3點: · 實參為數組名; · 形參為新申明的數組,如果有返回值,需在函數的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...