網上對Django教程都處在一個入門篇,對于想深入Django卻不知道如何入手。本人是一名iOS開發(fā)者裙顽,在工作閑暇時間接觸了python這么語言。在最近剛剛發(fā)布的語言排行榜中python已經躋身第一名宣谈。這得力于pyhton有非常多優(yōu)秀的第三方庫及今年特別火的人工智能(深度學習)愈犹。今天我想為大家分享的是Django這個Web服務器框架。了解Django會更好的了解服務器的工作闻丑,同時也鞏固我對python的知識面漩怎。Django的大門準備打開,are you ready 0鸬А扬卷?
項目是基于Mac系統(tǒng) python 2.7版本牙言。python工具是系統(tǒng)自帶酸钦。如果是windows請自行百度安裝python。首先第一步安裝Django咱枉。我這邊用的是pip工具卑硫。
sudo pip install django
我們開始搭建web框架
1.創(chuàng)建項目
# 指定路徑,創(chuàng)建一個名為Django_api的項目
cd Desktop
django-admin.py startproject Django_api
2.創(chuàng)建app(這里的app是指項目中的每個功能蚕断。如用戶登陸注冊可以放在同一個app中)
#進入項目路徑欢伏,創(chuàng)建一個叫用戶的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.
#提示此消息代表部署成功
現(xiàn)在我來講解一下目錄中的文件有何作用
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跳轉控制器(根據(jù)url跳轉對應的app中的view)
|-- wsgi.py : wsgi用于配置部署至云服務器的
|-- db.sqlite3: 系統(tǒng)默認用sqlite3數(shù)據(jù)庫(如果用mySQL或其他數(shù)據(jù)庫可忽略)
|-- manage.py: 用于啟動服務器,更新數(shù)據(jù)庫等操作庫
users文件夾中
||-- init.py:代表的是這是一個python文件
||-- admin.py:配置admin后臺管理系統(tǒng)的顯示方式及功能
||-- apps.py :配置users這個app的基本參數(shù)
||-- models.py:存放用戶模型
||-- tests.py:測試框架編寫
||-- view.py : 具體實現(xiàn)邏輯
講解了項目的創(chuàng)建及文件的作用亿乳,現(xiàn)在開始進行項目編寫
首先了解一下setting文件的配置硝拧,我主要講解一些重要的地方径筏。如有些未提及,可自行搜索障陶。
ALLOWED_HOSTS = [u'0.0.0.0',u'127.0.0.1']
ALLOWED_HOSTS設置的是允許用戶通過那個url訪問此服務器滋恬,如果未配置則訪問不到該服務器,用于我們現(xiàn)在處于測試狀態(tài)抱究,我們可以寫我們的本地地址以便于測試
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users'
]
在此配置中添加了最后一行'users'恢氯,代表此app允許在此服務器上面運行,如果未配置卻執(zhí)行該app則會報錯
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "testDjango",
'USER':'root',
'PASSWORD':'123456',
'HOST':'localhost',
}
}
數(shù)據(jù)庫我改為mysql數(shù)據(jù)庫鼓寺。注意key為大寫且固定字段不可隨意編寫勋拟。請確保數(shù)據(jù)庫配置正確。否則會編譯不通過妈候。
NAME: 數(shù)據(jù)庫名稱
USER: 數(shù)據(jù)庫用戶名
PASSWORD:數(shù)據(jù)庫密碼
HOST:數(shù)據(jù)庫域名
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配置此路徑后敢靡,在對應路徑創(chuàng)建文件夾,可把HTML文件放入此路徑中苦银。服務器才能識別(故 html文件應該存放在templates文件下)
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
應在對應位置創(chuàng)建static文件夾醋安,用于存放的是css等靜態(tài)文件。
基本配置完成后我們開始編寫第一個請求
打開urls文件編寫相應代碼(LoginView則在后面具體講解如何編寫)
# urls.py
from users.views import LoginView
urlpatterns = [
url(r'^login/',LoginView.as_view()),
]
當用戶發(fā)起http請求是訪問到該路徑如 http://0.0.0.0:8000/login?username=1&password=1
時墓毒。代表的是訪問該域名下的login路徑吓揪,通過urlpatternp配置會跳轉到LoginView.as_view()。傳遞的參數(shù)為username=1所计,password=1參數(shù)柠辞。
打開users中的views.py 實現(xiàn)具體的邏輯處理
class LoginView(View):
def get(self,request):
return HttpResponse("這是get請求")
def post(self,request):
return HttpResponse("這是post請求")
這是一個很簡單是處理請求。用戶訪問到該url時主胧,返回的是一個字符串表明是什么請求叭首。在下面我會告訴你如果去實現(xiàn)登陸,驗證請求參數(shù)等
實現(xiàn)登陸最重要的是通過用戶表踪栋。對用戶表進行增刪改查功能”焊瘢現(xiàn)在開始來講解一下。
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;
這個模型與普通創(chuàng)建的模型不一樣夷都,它是基于AbstractUser創(chuàng)建的模型眷唉,是重載了系統(tǒng)用戶模型《诠伲可通過系統(tǒng)的方法來實現(xiàn)登陸等操作冬阳。這模型中添加了別名,生日党饮,圖片等字段肝陪。verbose_name代表的是添加一個別名用于在admin中顯示的字段。重寫class Meta:的道理也是一樣刑顺。
2.修改settings文件
# settings.py
# 重裝自定義User表為系統(tǒng)用戶表
AUTH_USER_MODEL = 'users.User'
3.更新到數(shù)據(jù)庫
django中有兩個默認的方法氯窍,打開終端饲常,cd 到目錄下執(zhí)行
python manage.py makemigrations
python manage.py migrate
第一個是告訴數(shù)據(jù)庫有什么表添加。第二個是創(chuàng)建表狼讨。
4.添加數(shù)據(jù)
user = User.objects.Create_user(username='123',password='123')
創(chuàng)建系統(tǒng)用戶模型序調用User.objects.Create_user() 而不是 User.objects.Create()需要注意不皆。
5.添加校驗form
創(chuàng)建一個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的實現(xiàn)
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)
#判斷數(shù)據(jù)庫有沒有該有用戶
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出現(xiàn)的html網頁的處理,admin管理系統(tǒng)的處理熊楼,還有其他功能霹娄,將在下一章為你們展現(xiàn)。希望本章讓大家對django有個了解鲫骗。完成一次http請求后的django的執(zhí)行過程犬耻。謝謝大家的閱讀。
下面是對數(shù)據(jù)庫表的操作
1.Person.objects.all()
2.Person.objects.all()[:10] 切片操作执泰,獲取10個人枕磁,不支持負索引,切片可以節(jié)約內存
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 但是不區(qū)分大小寫,可以找到 ABC, Abc, aBC排苍,這些都符合條件
6.Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
7.Person.objects.filter(name__icontains="abc") #名稱中包含 "abc"沦寂,且abc不區(qū)分大小寫
8.Person.objects.filter(name__regex="^abc") # 正則表達式查詢
9.Person.objects.filter(name__iregex="^abc") # 正則表達式不區(qū)分大小寫filter是找出滿足條件的怎静,當然也有排除符合某條件的
10.Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
11.Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的0