網上對Django教程都處在一個入門篇,對于想深入Django卻不知道如何入手。本人是一名iOS開發者,在工作閑暇時間接觸了python這么語言。在最近剛剛發布的語言排行榜中python已經躋身第一名。這得力于pyhton有非常多優秀的第三方庫及今年特別火的人工智能(深度學習)。今天我想為大家分享的是Django這個Web服務器框架。了解Django會更好的了解服務器的工作,同時也鞏固我對python的知識面。Django的大門準備打開,are you ready !?
項目是基于Mac系統 python 2.7版本。python工具是系統自帶。如果是windows請自行百度安裝python。首先第一步安裝Django。我這邊用的是pip工具。
sudo pip install django
我們開始搭建web框架
1.創建項目
# 指定路徑,創建一個名為Django_api的項目
cd Desktop
django-admin.py startproject Django_api
2.創建app(這里的app是指項目中的每個功能。如用戶登陸注冊可以放在同一個app中)
#進入項目路徑,創建一個叫用戶的app
cd django_api
django-admin startapp users
3.查看是否部署成功
python manage.py runserver 0.0.0.0:8000
#July 26, 2017 - 01:49:25
#Django version 1.11.2, using settings 'django_api.settings'
#Starting development server at http://0.0.0.0:8000/
#Quit the server with CONTROL-C.
#提示此消息代表部署成功
現在我來講解一下目錄中的文件有何作用
django_api
|-- _init_.py
|-- settings.py
|-- urls.py
|-- wsgi.py
|--users
||-- _init_.py
||-- admin.py
||-- apps.py
||-- models.py
||-- tests.py
||-- view.py
|-- db.sqlite3
|-- manage.py
我們先講解django文件目錄下面的幾個文件
|-- init.py: 代表的是這是一個python文件
|-- settings.py : 服務器全局設置文件
|-- urls.py : url跳轉控制器(根據url跳轉對應的app中的view)
|-- wsgi.py : wsgi用于配置部署至云服務器的
|-- db.sqlite3: 系統默認用sqlite3數據庫(如果用mySQL或其他數據庫可忽略)
|-- manage.py: 用于啟動服務器,更新數據庫等操作庫
users文件夾中
||-- init.py:代表的是這是一個python文件
||-- admin.py:配置admin后臺管理系統的顯示方式及功能
||-- apps.py :配置users這個app的基本參數
||-- models.py:存放用戶模型
||-- tests.py:測試框架編寫
||-- view.py : 具體實現邏輯
講解了項目的創建及文件的作用,現在開始進行項目編寫
首先了解一下setting文件的配置,我主要講解一些重要的地方。如有些未提及,可自行搜索。
ALLOWED_HOSTS = [u'0.0.0.0',u'127.0.0.1']
ALLOWED_HOSTS設置的是允許用戶通過那個url訪問此服務器,如果未配置則訪問不到該服務器,用于我們現在處于測試狀態,我們可以寫我們的本地地址以便于測試
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users'
]
在此配置中添加了最后一行'users',代表此app允許在此服務器上面運行,如果未配置卻執行該app則會報錯
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "testDjango",
'USER':'root',
'PASSWORD':'123456',
'HOST':'localhost',
}
}
數據庫我改為mysql數據庫。注意key為大寫且固定字段不可隨意編寫。請確保數據庫配置正確。否則會編譯不通過。
NAME: 數據庫名稱
USER: 數據庫用戶名
PASSWORD:數據庫密碼
HOST:數據庫域名
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',
],
},
},
]
templates配置此路徑后,在對應路徑創建文件夾,可把HTML文件放入此路徑中。服務器才能識別(故 html文件應該存放在templates文件下)
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
應在對應位置創建static文件夾,用于存放的是css等靜態文件。
基本配置完成后我們開始編寫第一個請求
打開urls文件編寫相應代碼(LoginView則在后面具體講解如何編寫)
# urls.py
from users.views import LoginView
urlpatterns = [
url(r'^login/',LoginView.as_view()),
]
當用戶發起http請求是訪問到該路徑如 http://0.0.0.0:8000/login?username=1&password=1
時。代表的是訪問該域名下的login路徑,通過urlpatternp配置會跳轉到LoginView.as_view()。傳遞的參數為username=1,password=1參數。
打開users中的views.py 實現具體的邏輯處理
class LoginView(View):
def get(self,request):
return HttpResponse("這是get請求")
def post(self,request):
return HttpResponse("這是post請求")
這是一個很簡單是處理請求。用戶訪問到該url時,返回的是一個字符串表明是什么請求。在下面我會告訴你如果去實現登陸,驗證請求參數等
實現登陸最重要的是通過用戶表。對用戶表進行增刪改查功能。現在開始來講解一下。
1.打開users下的models.py文件
# models.py
from __future__ import unicode_literals
from datetime import datetime
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
nikeName = models.CharField(max_length=100,null=False,default="",verbose_name=u"昵稱");
birthday = models.DateField(verbose_name=u"生日",null=True,default=datetime.now);
image = models.ImageField(upload_to="image/%Y/%m",default="image/default.png")
class Meta:
verbose_name = "用戶信息"
verbose_name_plural = verbose_name;
def __unicode__(self):
return self.username;
這個模型與普通創建的模型不一樣,它是基于AbstractUser創建的模型,是重載了系統用戶模型。可通過系統的方法來實現登陸等操作。這模型中添加了別名,生日,圖片等字段。verbose_name代表的是添加一個別名用于在admin中顯示的字段。重寫class Meta:的道理也是一樣。
2.修改settings文件
# settings.py
# 重裝自定義User表為系統用戶表
AUTH_USER_MODEL = 'users.User'
3.更新到數據庫
django中有兩個默認的方法,打開終端,cd 到目錄下執行
python manage.py makemigrations
python manage.py migrate
第一個是告訴數據庫有什么表添加。第二個是創建表。
4.添加數據
user = User.objects.Create_user(username='123',password='123')
創建系統用戶模型序調用User.objects.Create_user() 而不是 User.objects.Create()需要注意。
5.添加校驗form
創建一個user_form.py文件
# user_form.py
from django import forms
class LoginFrom(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(required=True,min_length=5)
6.view的實現
from django.views.generic.base import View
from django.http import request,HttpResponse
from django.contrib.auth import authenticate,login
from .models import User
from user_forms import LoginFrom
class LoginView(View):
def get(self,request):
form = LoginFrom(request.GET);
#判斷校驗有沒有正確
if not form.is_valid():
return HttpResponse(form.errors)
#判斷數據庫有沒有該有用戶
user = authenticate(username=user_name, password=pass_word);
#如果有用戶登陸
if user is not None:
login(request, user)
return HttpResponse("登陸成功");
return HttpResponse("登陸失敗")
def post(self,request):
return HttpResponse("post請求暫未處理")
django出現的html網頁的處理,admin管理系統的處理,還有其他功能,將在下一章為你們展現。希望本章讓大家對django有個了解。完成一次http請求后的django的執行過程。謝謝大家的閱讀。
下面是對數據庫表的操作
1.Person.objects.all()
2.Person.objects.all()[:10] 切片操作,獲取10個人,不支持負索引,切片可以節約內存
3.Person.objects.get(name=name) #get是用來獲取一個對象的,如果需要獲取滿足條件的一些人,就要用到filter
4.Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴格等于 "abc" 的人
5.Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件
6.Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
7.Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區分大小寫
8.Person.objects.filter(name__regex="^abc") # 正則表達式查詢
9.Person.objects.filter(name__iregex="^abc") # 正則表達式不區分大小寫filter是找出滿足條件的,當然也有排除符合某條件的
10.Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
11.Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的0