一、新建project
使用Pycharm,File->New Project…,選擇Django,給project命名
(project不能用test命名)
新建的project目錄如下:
settings.py:工程相關的配置
urls.py:網站訪問入口,對應到views
wigs.py:部署相關
manage.py:執行命令
templates:html等靜態文件
備注:新建工程后需要安裝django的lib包,然后驗證django是否安裝成功
>>> import django
>>> django.VERSION
(1, 10, 5, 'final', 0)
二、新建app
python3 manage.py startapp app名字
(app名字不能和project同名)
app和project的區別:
project的作用是提供配置文件,比方說哪里定義數據庫連接信息, 安裝的app列表,TEMPLATE_DIRS ,等等。
一個app是一套Django功能的集合,通常包括模型和視圖,按Python的包結構的方式存在。
新建的app的結構如下:
三、django結構
django是基於MVC結構的
M:數據存儲層,操作數據庫。對應django中的models.py
V:模板,數據內容展示,包含數據邏輯。對應django中的templates(模板)和views.py(視圖,邏輯)
C:通過url找到具體方法函數。對應django中的urls.py,通過url找到views.py文件中具體的方法
四、創建模板,templates(模板)和views(視圖)
第一步:在app下的view.py文件中填寫視圖方法
一個方法對應一個返回的html頁面,並且可以給他傳遞數據(數據使用字典格式)。
from django.shortcuts import render
# Create your views here.
def home(request):
title="歡迎學習django"
list=[1,2,3]
# Create your views here.
def home(request):
title="歡迎學習django"
list=[1,2,3]
return render(request, 'home.html', {'title': title,'list':list})
request為請求的內容,可以解析獲得參數等各種信息
第二步:編寫view.py中用到的home.html模板
在templates文件夾下新建一個html叫做home.html。然后里面寫html語法即可
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<p>這里是內容</p>
{% for i in list %}
<p>這是第{{ i }}個內容</p>
{% endfor %}
{% if 2 > 3 %}
<p>2>3</p>
{% endif %}
{% if 5 > 3 %}
<p>5>3</p>
{% endif %}
</body>
</html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<p>這里是內容</p>
{% for i in list %}
<p>這是第{{ i }}個內容</p>
{% endfor %}
{% if 2 > 3 %}
<p>2>3</p>
{% endif %}
{% if 5 > 3 %}
<p>5>3</p>
{% endif %}
</body>
</html>
通過{{ 變量名 }}來引用views.py中傳遞的變量
django的模板支持循環for、條件if語句等,for和if語句使用views傳過來的變量,不需要再寫{{變量名}},直接用變量名引用
可以通過{% include 'Element/Element_menu.html' %}引入其他html模板,當前模板中接收的變量也可以傳遞給include進來的模板
如果所有頁面想使用一個公共變量,可以參考我的另一篇隨筆http://www.cnblogs.com/meitian/p/6557344.html
更多內容參考下面的教程
第三步:配置settings.py的INSTALLED_APPS
在INSTALLED_APPS下添加對應的app名稱,因為在加載views.py尋找具體的templates文件時,是尋找【INSTALLED_APPS下的目錄/templates】下的html文件
所以如果你把html文件放到了某個app下,就必須將這個app添加到INSTALLED_APPS中,如果直接放在工程的templates下了,則不需要添加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apptest',
]
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apptest',
]
第四步:設定urls.py,通過某個規則的url,找到對應的views.py的方法,進而加載html頁面
from django.conf.urls import url
from django.contrib import admin
from apptest import views
urlpatterns = [
url(r'^$',views.home),
url(r'^admin/', admin.site.urls),
]
from django.contrib import admin
from apptest import views
urlpatterns = [
url(r'^$',views.home),
url(r'^admin/', admin.site.urls),
]
導入具體的views文件,通過【url(url正則內容,具體的view方法)】來做綁定
url還可以增加第三個參數name,來給url綁定一個名字,這樣html中做跳轉時可以直接使用url的name,而不需要指定url鏈接
url(r'^elements/api/addpage[/]?$', apiview.api_addpage, name='api_addpage'),
在html中引用url的name時可以使用下面的方法:
window.location=("{% url "page" %}?pageid="+pageid)
第五步:啟動python服務
直接在命令行輸入【python3 manage.py runserver】
然后訪問http://127.0.0.1:8000/查看剛剛寫好的頁面
當然可以通過【python3 manage.py rumserver 8020 】來自定義一個端口號
五、創建接口,返回json數據
如果只是想通過url返回一串數據,而不是返回一個html頁面怎么辦?那就需要用到接口
第一步:創建接口
接口需要使用@api_view裝飾器,然后返回一個HttpResponse或JsonResponse,例如下面的例子:
@api_view(['POST', 'GET'])
def api_getallpage(request, *args):
response={"respcode":0}
pagelist=[]
for i in page.objects.all():
pagelist.append(i.getcontent())
response["pagelist"]=pagelist
return JsonResponse(response, content_type='application/json; charset=utf-8')
response={"respcode":0}
pagelist=[]
for i in page.objects.all():
pagelist.append(i.getcontent())
response["pagelist"]=pagelist
return JsonResponse(response, content_type='application/json; charset=utf-8')
可以使用下面的方法獲得get或post中請求參數
def parsedata(request):
data={}
if request.method == 'GET':
for k in request.query_params:
print(request.query_params)
print(k)
data[k] = request.query_params[k]
elif request.method == 'POST':
for k in request.data:
data[k] = request.data[k]
data={}
if request.method == 'GET':
for k in request.query_params:
print(request.query_params)
print(k)
data[k] = request.query_params[k]
elif request.method == 'POST':
for k in request.data:
data[k] = request.data[k]
return data
第二步:解析接口返回數據,使用json返回值
python解析接口返回的json數據,像使用字典一樣調用其中的返回值
import json
def getjsoninfo():#返回所有頁面信息,不支持將他放到方法外,會報錯url連接被拒絕
jsoninfos = urllib.request.urlopen(要訪問的url地址).read().decode('utf-8')
info = json.loads(jsoninfos)[“info"]
return info
上面的例子只獲得url地址的返回值,然后通過json.load()加載返回值,解析結果獲得key=info對應的值
六、django連接數據庫
django默認使用sqlite數據庫,可以改成使用MySQL數據庫,需要在settings.py中對MySQL進行配置
詳細的配置mysql數據庫,以及同步表結構的內容,詳見我的另一篇隨筆http://www.cnblogs.com/meitian/p/6412257.html
第一步:定義數據庫表信息
數據庫層在models.py中編寫,定義類名為表明,需繼承models.Model,類下定義的變量為models的某個類型字段
django支持以下字段:
'AutoField', 'BLANK_CHOICE_DASH', 'BigAutoField', 'BigIntegerField',
'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField',
'DateField', 'DateTimeField', 'DecimalField', 'DurationField',
'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField',
'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField',
'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField',
'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField',
'TimeField', 'URLField', 'UUIDField',
'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField',
'DateField', 'DateTimeField', 'DecimalField', 'DurationField',
'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField',
'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField',
'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField',
'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField',
'TimeField', 'URLField', 'UUIDField',
常用的設置說明:
自增列:每次id自動+1,適合id標識,同時配合primary_key=True將其設置為主鍵
models.AutoField(primary_key=True)
字符型的字段:max_length設置字符最大長度
models.CharField(max_length=120)
設置外鍵:
models.ForeignKey(要設置的外鍵的類名)
一個例子如下:
class page(models.Model):
pageid=models.AutoField(primary_key=True)
chinessname=models.CharField(max_length=120)
englishname=models.CharField(max_length=120)
pagedesc=models.CharField(max_length=120)
operator=models.CharField(max_length=120,default="")
def getcontent(self):
return {"pageid":self.pageid,"chinessname":self.chinessname,"englishname":self.englishname,"pagedesc":self.pagedesc}
def getpageid(self):
pageid=models.AutoField(primary_key=True)
chinessname=models.CharField(max_length=120)
englishname=models.CharField(max_length=120)
pagedesc=models.CharField(max_length=120)
operator=models.CharField(max_length=120,default="")
def getcontent(self):
return {"pageid":self.pageid,"chinessname":self.chinessname,"englishname":self.englishname,"pagedesc":self.pagedesc}
def getpageid(self):
return self.pageid
class elements(models.Model):
elementid=models.AutoField(primary_key=True)
pageid=models.ForeignKey(page)
variablename=models.CharField(max_length=120)
variabledesc=models.CharField(max_length=120)
find_by_android_option=models.CharField(max_length=120)
find_by_android_value=models.CharField(max_length=120)
find_by_iOS_option=models.CharField(max_length=120)
find_by_iOS_value=models.CharField(max_length=120)
operator = models.CharField(max_length=120,default="")
一個models.Model對象可以理解為一個表的查詢結果,可能是一行,可能是多行。
通過定義一個方法,return self.字段名,會返回數據表中一條查詢結果的,對應字段的一個具體值,這樣在調用的時候很方便。
第二步:創建model對象,增刪改查表
models.Model提供了接口進行增刪改查
新增數據:
models類名(字段1名字=“值1”,字段2名字=“值2”....).save()
例如:
查詢數據:
1.查詢返回單條結果
models類.objects.get(字段=xxx),例如下面的例子
pageid = page.objects.get(englishname=data["englishname"])
2.過濾,查詢返回多條結果(即使只命中一條也是個list)
models類.objects.filter(字段=xxx),例如下面的例子
elemenstinfo=elements.objects.filter(pageid=data["pageid"]
3.返回對象下的全部結果
models類.objects.all()
例如:
page.objects.all()
上面返回的結果都是models的對象,而我們想要的是某個字段的具體值,或把結果存到一個字典里
所以這里就引用到了我們第一步里創建models類時,定義一個返回自身字段的方法。這樣我們就可以調用方法獲得對象的某些值
例如:
pageinfo=page.objects.get(pageid=data["pageid"]).getcontent()
刪除數據:
使用models對象.delete()將取到的models對象刪除掉
page.objects.get(pageid=data["pageid"]).delete()
更新數據:
更新用的就是新增數據的接口,使用save()即可
到這里就可以創建一個簡單的web站點了,因為部署的還差一個nginx配置靜態資源的,暫時不上傳,等試驗過后我會更新隨筆
