01.Django-基礎

web框架之Django基礎

1. Django的簡介

Django是一個由python寫成的開放源代碼的Web應用框架。javascript

Django的目的是使常見的Web開發任務,快速和容易。css

2. Django框架的特色

1. 遵循MVC開發模式
2. 內置進行快速web開發所需的各類組件
3. 利用ORM(對象關係映射)機制來定義和數據庫,使開發人員能夠構建出獨立於具體數據庫引擎的web應用
4. 內置後臺管理web應用
5. 內置web Server,開發人員無需安裝任何web Server就能夠進行各類web應用的開發和測試
6. 具備靈活而強大的自定義url系統
7. 內置多語種支持,能夠方便地構建多國語言的web應用

MVC設計模式

Django是一種遵循MVC開發模式的框架.html

models.py文件中定義各類類表明的數據模型(Model)和數據庫引擎交互,執行數據庫數據的存取操做.
templates文件夾中的各個模板文件表明視圖(View),負責數據內容的顯示
urls.py中定義了各類url訪問入口和views.py中定義的各類處理函數(也稱爲Django視圖函數),能夠根據用戶輸入的url請求,調用views.py中相應的函數,數據模型和視圖交互,響應用戶的請求.

如圖所示:java

img

基於Djangoweb應用開發活動因爲主要集中在models.py,templates文件夾中的各模板文件以及views.py以內,所以Django的開發模式一般也稱爲MTV開發模式python

3. 安裝

方式一,pip方式安裝git

pip install Django

方式二,pycharm中在file菜單中安裝github

在pycharm中找開file-->settings-->Project-->Project Interpreter

方式三,到github克隆安裝web

git clone https://github.com/django/django.git

4. 基本配置

4.1 經常使用的命令

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代碼爲每一個請求,
這樣開發人員不須要從新啓動服務器代碼更改生效,正則表達式

4.2 Django程序基本目錄及做用:

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/'

4.3 靜態文件:

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>

4.4 路由系統

URL配置就像Django所支撐網站的目錄,其本質是URL模式以及要爲該URL模式調用的視圖函數之間的映射表

Django中,每個請求的URL都要有一條路由映射,這樣才能將請求交給對一個view中的函數去處理

格式:

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

4.4.1 單一路由分配

#匹配名稱爲inex的視圖
url(r"^index$",views.index),

4.4.2 基於正則的路由分配

#匹配以index/開頭,後接任意個數字的視圖
url(r'^index/(\d*)',views.index),
#匹配以index/開頭,後接任意長度的字母的視圖,並把正則表達式的分組匹配到的字段信息發送給客戶端
url(r"^index/(?P<name>\w*)/(?P<id>\d*)",views.index),

4.4.3 添加額外的參數

#匹配以manage/開頭,後接任意長度的字母的視圖,並把值爲333的id信息發送給客戶端
url(r'^manage/(?P<name>\w*)',views.manage,{'id':333}),

4.4.4 路由映射設置名稱

#匹配以home/開頭的視圖,並把別名設爲h1
url(r'^home',views.home,name='h1'),
#匹配以index/開頭,後接數字的視圖,並把別名設置爲h2
url(r'^index/(\d*)',views.index,name='h2'),

4.4.5 路由分發

若是映射URL太多,都寫在一個URLpatterns顯得繁瑣,可使用路由分發功能
那就是在每一個應用裏面單獨創建urls,即路由分發器.每一個應用的視圖都分別到各自的應用中找,避免由於一個應用的崩潰而影響整個項目.

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

須要注意的是:
URL多傳一個參數,那views函數就必需要多接受一個參數

4.5 視圖層

對邏輯負責處理用戶的請求並返回響應,返回能夠是HTML網頁,或者重定向,或者404錯誤,或者一個XML文件,也能夠是一個對象

在一個文件中稱之爲視圖views.py,放在項目或應用程序目錄

HTTP請求中產生兩個核心對象

HTTP請求:HttpRequest
HTTP響應:HttpResponse對象

4.5.1 HttpResponst對象

#從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時,該屬性纔可用

4.5.2 HttpRequest對象

HttpRequest對象由Django自動建立

HttpResponse由開發人員建立,每一個view請求處理方法必須返回一個HttpResponse對象

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

4.5.2.1 render()

格式:

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'})
4.5.2.2 rdirect("路徑")

格式:

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')
4.5.2.3 locals() 把視圖函數中全部的變量傳給模板

例子:

def register(request):

	a1="aaa"
	a2="bbb"
	a3="ccc"
	a4="ddd"

	return render(request,"index.html",locals())#一次性把a1,a2,a3,a4四個變量傳給模板
相關文章
相關標籤/搜索