一、創建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程式時,本質上都是自動執行上述命令
二.配置文件
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.nameView 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