Django是一個由python寫成的開放源代碼的Web應用框架。javascript
Django的目的是使常見的Web開發任務,快速和容易。css
1. 遵循MVC開發模式 2. 內置進行快速web開發所需的各類組件 3. 利用ORM(對象關係映射)機制來定義和數據庫,使開發人員能夠構建出獨立於具體數據庫引擎的web應用 4. 內置後臺管理web應用 5. 內置web Server,開發人員無需安裝任何web Server就能夠進行各類web應用的開發和測試 6. 具備靈活而強大的自定義url系統 7. 內置多語種支持,能夠方便地構建多國語言的web應用
Django是一種遵循MVC開發模式的框架.html
models.py文件中定義各類類表明的數據模型(Model)和數據庫引擎交互,執行數據庫數據的存取操做. templates文件夾中的各個模板文件表明視圖(View),負責數據內容的顯示 urls.py中定義了各類url訪問入口和views.py中定義的各類處理函數(也稱爲Django視圖函數),能夠根據用戶輸入的url請求,調用views.py中相應的函數,數據模型和視圖交互,響應用戶的請求.
如圖所示:java
基於Django的web應用開發活動因爲主要集中在models.py,templates文件夾中的各模板文件以及views.py以內,所以Django的開發模式一般也稱爲MTV開發模式python
方式一,pip方式安裝git
pip install Django
方式二,pycharm中在file菜單中安裝github
在pycharm中找開file-->settings-->Project-->Project Interpreter
方式三,到github克隆安裝web
git clone https://github.com/django/django.git
在IDE中建立Django程序時,本質上都是自動執行上述命令ajax
#查看Django版本 python -m django --version #建立一個名爲mysite的項目 django-admin startproject mysite #Django項目環境終端 python manage.py shell #建立應用程序,確保和manage.py是同一個目錄 python manage.py startapp polls #啓動Django,端口使用Django默認的8000 python manage.py runserver #啓動Django,端口爲8800 python manage.py runserver 8800 #啓動Django,端口爲8800,任意機器均可以訪問 python manage.py runserver 0.0.0.0:8800 #進行建立模型變化遷移 python manage.py makemigrations #運行應用模型變化到數據庫 python manage.py migrate #同步到數據庫 python manage.py syncdb #清空數據庫(保留空表) python manage.py flush #admin建立管理員用戶 python manage.py createsuperuser #修改用戶密碼 python manage.py changepassword username
Django會自動從新加載runserver,根據須要開發服務器自動從新加載python代碼爲每一個請求,
這樣開發人員不須要從新啓動服務器代碼更改生效,正則表達式
mysite/ #項目容器,名稱根據須要自定義 manage.py #與該Django項目進行交互的命令行實用工具 mysite/ #實際的python項目 __init__.py #空文件 setting.py #Django的項目配置文件 urls.py #路由分發,url中的path(路徑)與視圖函數的映射關係 wsgi.py #一個入口爲WSGI兼容的WEB服務器 appname models #與數據庫交互的文件 views #存放視圖函數的
setting.py配置文件的說明
#導入OS模塊 import os #指定本項目的基本目錄爲這個項目所在的容器的路徑 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = ')f9lt68ux%%98t872s8l#8i8w7(p8e&)m-yafln3%d%z2x!9st' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True #白名單 ALLOWED_HOSTS = [] # 程序定義文件 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog',] # 中間件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',] ROOT_URLCONF = 'url_config.urls' #模板,用來存放html文件 TEMPLATES = [ {'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] #網絡服務網關接口 WSGI_APPLICATION = 'url_config.wsgi.application' # Database # 配置數據庫,Django默認使用sqlite數據庫,默認自帶sqlite數據庫驅動, # 所使用的數據庫的引擎爲django.db.backends,sqlite3 # 指定使用的數據庫的路徑 DATABASES = {'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}} # Password validation AUTH_PASSWORD_VALIDATORS = [ {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',}, {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',}, {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',}, {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},] # Internationalization #配置項目初始化時的一些參數 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # 指定靜態文件夾,用來存放css,javascript,image等文件 STATIC_URL = '/static/'
在setting裏修改添加,用來存放CSS,javascript,image等文件
首先,建立static文件夾,而後修改setting.py配置文件
STATIC_URL='/static/' #至關於別名 #指定靜態文件的目錄 STATIC_ROOT={ os.path.join(BASE_DIR,"app_01/static"), }
想使用靜態文件,必須在要建立的網頁文件中寫入引入語句:
{% load staticfiles $} #寫在引入靜態文件的網頁的第一行 {% static '文件名' %} #寫在文件當中
引入靜態文件的步驟:
1.把全部的靜態文件放到一個static文件夾中 2.將static文件夾放在應用文件夾下 3.在setting配置文件中配置別名 STATIC_URL='/static/' STATIC_ROOT=( os.path.join(BASE_DIR,"應用名/static"), ) 4.在模板文件的首行加上"{% load staticfiles %}" 5.在模板文件中引入靜態文件: {% static static靜態文件的路徑 %}
例如,在一個項目中,使用bootstrap的樣式,就必須這樣寫:
{% load staticfiles %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}"> <style type="text/css"> </style> </head> <body> <div class="container"> <div class="row"> </div> </div> </body> </html>
URL配置就像Django所支撐網站的目錄,其本質是URL模式以及要爲該URL模式調用的視圖函數之間的映射表
在Django中,每個請求的URL都要有一條路由映射,這樣才能將請求交給對一個view中的函數去處理
格式:
urlpatterns=[ url(正則表達式,views視圖函數,參數,別名) ]
#匹配名稱爲inex的視圖 url(r"^index$",views.index),
#匹配以index/開頭,後接任意個數字的視圖 url(r'^index/(\d*)',views.index), #匹配以index/開頭,後接任意長度的字母的視圖,並把正則表達式的分組匹配到的字段信息發送給客戶端 url(r"^index/(?P<name>\w*)/(?P<id>\d*)",views.index),
#匹配以manage/開頭,後接任意長度的字母的視圖,並把值爲333的id信息發送給客戶端 url(r'^manage/(?P<name>\w*)',views.manage,{'id':333}),
#匹配以home/開頭的視圖,並把別名設爲h1 url(r'^home',views.home,name='h1'), #匹配以index/開頭,後接數字的視圖,並把別名設置爲h2 url(r'^index/(\d*)',views.index,name='h2'),
若是映射URL太多,都寫在一個URLpatterns顯得繁瑣,可使用路由分發功能
那就是在每一個應用裏面單獨創建urls,即路由分發器.每一個應用的視圖都分別到各自的應用中找,避免由於一個應用的崩潰而影響整個項目.
url(r'^blog/',include('blog.urls')),
須要注意的是:
URL多傳一個參數,那views函數就必需要多接受一個參數
對邏輯負責處理用戶的請求並返回響應,返回能夠是HTML網頁,或者重定向,或者404錯誤,或者一個XML文件,也能夠是一個對象
在一個文件中稱之爲視圖views.py,放在項目或應用程序目錄
HTTP請求中產生兩個核心對象
HTTP請求:HttpRequest HTTP響應:HttpResponse對象
#從django.http模塊中導入HttpResponse from django.http import HttpResponse #導入datetime模塊 import datetime def current_datetime(request): now=datetime.datetime.now()#獲取系統當前時間 html="<html><body>如今時刻:%s.</body></html>" %now return HttpResponse(html)
在這個(views.py)視圖中每個函數稱做視圖函數,視圖函數都以一個HttpRequest對象爲第一個參數,該參數一般命名爲request
在上面的代碼中,獲得的第一個參數是一個HttpRequest對象,經過request.***
的方式
path #使用GET方法時,只會獲得路徑 get_full_path() #使用GET方法時,會獲得包括路徑和?,=等信息的全路徑 method #獲得客戶端請求網頁的HTTP方法,POST或者GET GET #包含全部的HTTP的GET方法的類字典對象 POST #包含全部的HTTP的POST方法的類字典對象 COOKIES #包含cookies的字典對象,其鍵和值都是字符串 FILES #經過表單上傳的文件的類字典對象,其每一個key都是input標籤中name屬性的值,其每個value的值是一個標準的python字典對象 filename #表示上傳文件的文件名 content-type #表示上傳文件的內容原型 content #表示上傳文件的原始內容 META #一個包含全部有效的HTTP頭信息的字典 content_length #所接收的數據的長度 content_type #所接收的數據的類型 query_string #接收的原始請求字符串 remote_addr #客戶端的IP地址 remote_host #客戶端的主機名稱 server_name #服務端的主機名 server_port #服務端的端口號 http_accept_encoding http_accept_language http_host #客戶端發送的HOST頭信息 http_referer #被指向的頁面 http_user_agent #客戶端使用的瀏覽器的信息 http_x_bender #X_bender頭信息 session #惟一可讀寫的類字典對象,表示與服務端的當前會話信息 body #POST原始數據,用於對數據的複雜處理 has_key() #布爾值,標識request.GET或request.POST是否包含指定的鍵 is_secure() #客戶端發出的請求是否安全 is_ajax() user #是一個django.contrib.auth.models.User對象,表明當前登錄的用戶,若是當前訪問用戶沒有登錄,其值將被初始化爲django.contrib.auth.models.AnonymousUser的實例,只有激活Django中的AuthenticationMideleware時,該屬性纔可用
HttpRequest對象由Django自動建立
HttpResponse由開發人員建立,每一個view請求處理方法必須返回一個HttpResponse對象
格式:
render(request,template_name,context=None,content_type=None,status=None,using=None)
參數說明:
template_name爲模板的名字,是必要的參數 可選的參數: context 開發人員能夠添加一個字典信息到模板中,用來提示用戶,默認是一個空字典 content_type MIME類型用於生成文檔 status 爲響應狀態代碼,默認值爲200 using
也可使用render_to_response("網頁文件")
結合給定的模板與一個給定的上下文,返回一個字典HttpResponse的渲染文本對象
例子:
from django.shortcuts import render def index(request): return render(request,'index.html',{'msg':'hello world'})
格式:
redirect(to,args,kwargs)
重定向方法,能夠在符合某個條件的時候跳轉到另外一個頁面,
例子:
from django.shortcuts import render, HttpResponse,redirect def register(request_info): if request_info.method == 'POST': user = request_info.POST.get('user') pwd = request_info.POST.get('pwd') if user == 'hello' and pwd == 'world': return redirect('/login/') return HttpResponse('帳號或密碼錯誤') return render(request_info,'register.html') def login(request_info): return render(request_info,'login.html')
例子:
def register(request): a1="aaa" a2="bbb" a3="ccc" a4="ddd" return render(request,"index.html",locals())#一次性把a1,a2,a3,a4四個變量傳給模板