Django是一個開放源代碼的Web應用框架,由python寫成,初次發佈於2005年7月,並於2008年9月發佈了第一個正式版本1.0html
MVC:MVC是一種軟件設計典範,核心思想是解耦python
MVC優勢:下降各功能模塊之間的耦合性,方便變動,更容易重構代碼,最大程度上實現了代碼重用mysql
Django Version | Pyhton Version |
---|---|
1.8 | 2.7 ,3.2(until the end of 2016) ,3.3 ,3.4 ,3.5, |
1.9 1.10 | 2.7 ,3.4 ,3.5, |
1.11 | 2.7 ,3.4 ,3.5, 3.6 |
2.0 | 3.4 ,3.5, 3.6 |
2.1 | 3.5, 3.6,3.7 |
Model(模型):是應用程序中用於處理程序邏輯的部分,負責數據庫中存儲數據sql
View(視圖):是應用程序中處理數據顯示的部分,一般視圖是依據模型數據建立的shell
Controller(控制器):是應用程序中處理用戶交互的部分,一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據數據庫
本質與MVC模式沒有區別,只是定義形式不一樣django
Model(模型):負責業務對象與數據庫的對象(ORM)segmentfault
Template(模板):負責如何把頁面展現給用戶cookie
View(視圖):負責業務邏輯,並在適當的時候調用Model和Templatesession
# 黑屏終端,進入指定目錄 建立工程 django-admin startproject project
setting.py
中配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django', #數據庫名字 'USER': 'root', #帳號 'PASSWORD': '123456', #密碼 'HOST': '127.0.0.1', #IP 'PORT': '3306', #端口 } }
在__init__.py
文件中寫入如下兩行代碼:
import pymsql pymsql.install_as_Mysqldb()
或者安裝pip install mysqlclient或者pip install mysql-python
安裝出錯能夠到http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
下載對應版本安裝。
在一個工程中能夠建立一個到多個應用,每一個應用處理一種業務邏輯
打開黑屏終端進入工程目錄下 python manage.py startapp myApp
目錄結構:
├── db.sqlite3 # 數據庫 ├── myApp # 一個應用 │ ├── admin.py # 管理 │ ├── apps.py # 應用的配置 │ ├── __init__.py │ ├── migrations # model到數據庫映射的中間文件 │ │ └── __init__.py │ ├── models.py # model │ ├── tests.py # 在這裏能夠寫測試代碼 │ └── views.py # 視圖 ├── project # 建立項目時建立的目錄 │ ├── __init__.py │ ├── settings.py # 項目的配置文件 │ ├── urls.py # 根路由 │ └── wsgi.py └── manage.py
# setting.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myApp', ]
python manage.py runserver ip:port
ip能夠不寫 python manage.py runserver
端口默認8000,能夠單獨修改 python manage.py runserver port
modeles.py
from django.db import models # Create your models here. class Grade(models.Model): name = models.CharField(max_length=20) boyNum = models.IntegerField() girlNum = models.IntegerField() isDelete = models.BooleanField(default=False) def __str__(self): return self.name class Student(models.Model): name = models.CharField(max_length=20) sex = models.BooleanField() age = models.IntegerField() content = models.CharField(max_length=40) # 關聯類名的小寫加引號或者直接類名 grade = models.ForeignKey('grade') isDelete = models.BooleanField(default=False) def __str__(self): return self.name
說明:不須要定義主鍵列,在生成時會自動添加,而且值爲自動增加
生成遷移文件:python manage.py makemigrations [app名字]
做用: 在應用目錄下的migrations目錄下成遷移文件
執行遷移: python manage.py migrate [app名字]
做用:至關於執行sql語句生成數據表,表名爲 應用名全小寫_類名全小寫
查看建表語句: python manage.py sqlmigrate app名字 0001
說明:0001爲makemigrations以後產生了0001_initial.py文件
# 進入pyhton shell模式 python manage.py shell # 引入包 from myApp.models import Grade,Student # 增 >>> grade = Grade() >>> grade.name = "python01" >>> grade.boyNum = 50 >>> grade.girlNum = 10 >>> grade.save() >>> stu = Student() >>> stu.name = "sunck" >>> stu.sex = "True" >>> stu.age = 18 >>> stu.contend = "sunck is a good man" >>> stu.grade = grade >>> stu.save() # 刪 stu.delete() # 改 >>> stu.age = 17 >>> stu.save() # 查 stus = Student.objects.all() grade = Grade.objects.get(pk=1)
在Django中視圖對WEB請求進行響應的,視圖的本質是python中的函數,在views.py文件中定義,
視圖接收request對象做爲第一個參數,包含了請求的信息
view.py
from django.shortcuts import render from django.http import HttpResponse from myApp.models import Grade, Student def index(request): return HttpResponse("sunck is a good man") def detail(request, num): return HttpResponse("detail %s" % num)
path: 請求頁面的全路徑,不包括域名 method: 請求中使用的HTTP方法的字符串表示。全大寫表示。例如 if request.method == "GET": do_something() elif request.method == "POST": do_something_else() GET: 包含全部HTTP GET參數的類字典對象 POST:包含全部HTTP POST參數的類字典對象 user:是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前沒有登錄,user將被初始化爲 django.contrib.auth.models.AnonymousUser的實例(匿名用戶)。你能夠經過user的is_authenticated()方法來辨別 用戶是否登錄: if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware時該屬性纔可用 session:惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中的session支持時該屬性纔可用。 COOKIES: 包含全部cookies的標準Python字典對象;keys和values都是字符串。 FILES: 包含全部上傳文件的類字典對象;FILES中的每個Key都是 <input type = "file"name = ""/> 標籤中 name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys: filename: 上傳文件名,用字符串表示 content_type: 上傳文件的ContentType content: 上傳文件的原始內容
主路由:與工程名相同名字的目錄下的urls.py文件
配置文件:ROOT_URLCONF = 'project.urls'
urls.py
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), # 包含子路由 url(r'^', include('myApp.urls')), ]
子路由:在應用目錄下建立名爲urls.py的文件
做用:路由分發,規定哪一個網址由哪一個視圖處理
urls.py
from django.conf.urls import url from myApp import views urlpatterns = [ # 路由匹配 url(r'index/', views.index), url(r'detail/(\d+)/', views.detail), ]
概述:模板是HTML界面,能夠根據視圖傳遞的數據進行填充
建立模板目錄:工程目錄下建立名爲templates的目錄,也能夠放在項目目錄中
settings.py
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "templates")], 'APP_DIRS': True, }
grade.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班級信息</title> </head> <body> <h1>班級信息</h1> <ul> {% for grade in grades %} <li>{{ grade.name }}</li> {% endfor %} </ul> </body> </html>
student.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生信息</title> </head> <body> <h1>學生信息</h1> <ul> {% for stu in stusList %} <li>{{ stu.name }}--{{ stu.grade }}--{{ stu.age }}</li> {% endfor %} </ul> </body> </html>
在視圖中返回模板
views.py
from myApp.models import Grade, Student def students(request): #獲取全部學生信息列表 stus = Student.objects.all() return render(request, 'students.html', {"stusList":stus}) def grades(request): grades = Grade.objects.all() return render(request, 'grades.html', {'grades': grades}) def gstudents(request, gid): stus = Student.objects.filter(grade_id=gid) return render(request, "students.html", {"stusList":stus})
urls.py
url(r'students/grade/(\d+)/', views.gstudents),