django介紹
Django 是用python開發(fā)的一個(gè)免費(fèi)開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!
django需要的一些基礎(chǔ)知識(shí):
- Django是 python語言寫的一個(gè)Web框架包,所以你得知道一些 Python 基礎(chǔ)知識(shí)。
- 其次你最好有一些做網(wǎng)站的經(jīng)驗(yàn),懂一些網(wǎng)頁 HTML, CSS, JavaScript 的知識(shí)。
- socket(套接字)或者網(wǎng)絡(luò)方面的知識(shí)點(diǎn)
沒有經(jīng)驗(yàn)也沒有關(guān)系,慢慢來就好了,你一定可以學(xué)會(huì),Django 很簡單!
django 框架基礎(chǔ)
- Model(模型):負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的對(duì)象(ORM)
- Template(模版):負(fù)責(zé)如何把頁面展示給用戶
- View(視圖):負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r(shí)候調(diào)用Model和Template
- URL Django還有一個(gè)url分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁面請(qǐng)求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template index index
- 其他ajax
對(duì)python web程序來說,一般會(huì)分為兩部分:服務(wù)器程序和應(yīng)用程序。服務(wù)器程序負(fù)責(zé)對(duì)socket服務(wù)器進(jìn)行封裝,并在請(qǐng)求到來時(shí),對(duì)請(qǐng)求的各種數(shù)據(jù)進(jìn)行整理。應(yīng)用程序則負(fù)責(zé)具體的邏輯處理。為了方便應(yīng)用程序的開發(fā),就出現(xiàn)了眾多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的開發(fā)方式,但是無論如何,開發(fā)出的應(yīng)用程序都要和服務(wù)器程序配合,才能為用戶提供服務(wù)。這樣,服務(wù)器程序就需要為不同的框架提供不同的支持。這樣混亂的局面無論對(duì)于服務(wù)器還是框架,都是不好的。對(duì)服務(wù)器來說,需要支持各種不同框架,對(duì)框架來說,只有支持它的服務(wù)器才能被開發(fā)出的應(yīng)用使用。這時(shí)候,標(biāo)準(zhǔn)化就變得尤為重要。我們可以設(shè)立一個(gè)標(biāo)準(zhǔn),只要服務(wù)器程序支持這個(gè)標(biāo)準(zhǔn),框架也支持這個(gè)標(biāo)準(zhǔn),那么他們就可以配合使用。一旦標(biāo)準(zhǔn)確定,雙方各自實(shí)現(xiàn)。這樣,服務(wù)器可以支持更多支持標(biāo)準(zhǔn)的框架,框架也可以使用更多支持標(biāo)準(zhǔn)的服務(wù)器。
在做驗(yàn)證的時(shí)候
前后端交付
PHP:activerecord
Java:Hibernate
C#:Entity Framework
MVC和MTV
MVC:Model、View、Controller
MTV:Model、Template、View
WSGI(Web Server Gateway Interface)是一種規(guī)范,它定義了使用python編寫的web app與web server之間接口格式,實(shí)現(xiàn)web app與web server間的解耦。
django是怎么工作的
python標(biāo)準(zhǔn)庫提供的獨(dú)立WSGI服務(wù)器稱為wsgiref。
一、創(chuàng)建django程序
1、終端:django-admin startproject sitename
2、IDE創(chuàng)建Django程序時(shí),本質(zhì)上都是自動(dòng)執(zhí)行上述命令
常用命令:
python manage.py runserver 0.0.0.0 啟動(dòng)django項(xiàng)目
python manage.py startapp appname 創(chuàng)建一個(gè)djangoapp
python manage.py syncdb 同步數(shù)據(jù)庫 1.7.4之前的版本
python manage.py makemigrations 基于當(dāng)前的model創(chuàng)建新的遷移策略文件 簡單來說 就是生成sql
python manage.py migrate 用于執(zhí)行遷移動(dòng)作 執(zhí)行sql
python manage.py createsuperuser 創(chuàng)建第一個(gè)用戶
二、Django程序目錄
setting: 全局的配置文件
urls: 一個(gè)URL對(duì)應(yīng)一個(gè)視圖函數(shù)
wsgi: web服務(wù)網(wǎng)關(guān)接口 創(chuàng)建socket對(duì)象
template: 存放模板的位置
tests: 單元測試
三配置文件
1.數(shù)據(jù)庫
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'dbname',
'USER': 'root',
'PASSWORD': 'xxx',
'HOST': '',
'PORT': '',
}
}
- 模板
TEMPLATE_DIRS = (
os.path.join(BASE_DIR,'templates'),
)
- 靜態(tài)文件
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
四.路由系統(tǒng)
1、每個(gè)路由規(guī)則對(duì)應(yīng)一個(gè)view中的函數(shù)
#動(dòng)態(tài)路由 查看第一頁內(nèi)容 查看第二個(gè)內(nèi)容
url(r'^news/(\d*)(\d*)', views.news), #添加一個(gè)匹配數(shù)字的 ()分組匹配
#獲取這個(gè)值有什么用類 我們可以根據(jù)這個(gè)值來獲取數(shù)據(jù) 所有的正則表達(dá)式都是支持的
#?P<name> 指定形式參數(shù)的名字 可以通過名字來調(diào)用
#我們可以指定位置來獲取數(shù)據(jù) 而不是按照傳進(jìn)來的參數(shù)來分
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),
2、根據(jù)app對(duì)路由規(guī)則進(jìn)行一次分類
#二級(jí)路由
url(r'^web/',include('web.urls')),
django中的路由系統(tǒng)和其他語言的框架有所不同,在django中每一個(gè)請(qǐng)求的url都要有一條路由映射,這樣才能將請(qǐng)求交給對(duì)一個(gè)的view中的函數(shù)去處理。其他大部分的Web框架則是對(duì)一類的url請(qǐng)求做一條路由映射,從而是路由系統(tǒng)變得簡潔。
總結(jié)
- 靜態(tài)路由
- 動(dòng)態(tài)路由
按照順序,第n個(gè)匹配的數(shù)據(jù),交給函數(shù)的第n個(gè)參數(shù),嚴(yán)格按照順序
模板的方法,將匹配的參數(shù),傳給指定的形式參數(shù) - 二級(jí)路由
ceshi.url.py 首先在ceshiapp里面定義一個(gè)urls文件 寫法跟urls一樣的
include(ceshi.url) 然后在project里面定義一個(gè)includeceshiapp下面的urls
然后在用戶訪問ceshiapp的時(shí)候會(huì)進(jìn)行一個(gè)轉(zhuǎn)發(fā)的功能
五. 模型
到目前為止,當(dāng)我們的程序涉及到數(shù)據(jù)庫相關(guān)操作時(shí)一般做一下幾個(gè)操作:
- 創(chuàng)建數(shù)據(jù)庫,設(shè)計(jì)表結(jié)構(gòu)和字段
- 使用 MySQLdb 來連接數(shù)據(jù)庫,并編寫數(shù)據(jù)訪問層代碼
- 業(yè)務(wù)邏輯層去調(diào)用數(shù)據(jù)訪問層執(zhí)行數(shù)據(jù)庫操作
django為使用一種新的方式,即:關(guān)系對(duì)象映射(Object Relational Mapping,簡稱ORM)。 code frist 代碼優(yōu)先
自己寫類 --> 數(shù)據(jù)庫表
默認(rèn)支持admin后臺(tái)登錄 如果輸入用戶名密碼 它是不是要進(jìn)行比較 它進(jìn)行比較是不是跟某一個(gè)數(shù)據(jù)庫里面的某一個(gè)字段進(jìn)行比較
django自己創(chuàng)建表 并且知道表的結(jié)構(gòu) 有數(shù)據(jù)的支撐 django默認(rèn)會(huì)創(chuàng)建幾張表
配置數(shù)據(jù)庫在settings里面
默認(rèn)不配置的情況下會(huì)放到sqllite3
生產(chǎn)數(shù)據(jù)庫需要執(zhí)行命令 1. makemigrations #生成配置文件
2. migrate #根據(jù)配置文件創(chuàng)建數(shù)據(jù)庫相關(guān)
django中遵循 Code Frist 的原則,即:根據(jù)代碼中定義的類來自動(dòng)生成數(shù)據(jù)庫表。
a. 創(chuàng)建類
b. 使用命令生成
1、創(chuàng)建Model,之后可以根據(jù)Model來創(chuàng)建數(shù)據(jù)庫表
from django.db import models
class userinfo(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField()
memo = models.TextField()
字段
1、models.AutoField 自增列 = int(11)
如果沒有的話,默認(rèn)會(huì)生成一個(gè)名稱為 id 的列,如果要顯示的自定義一個(gè)自增列,必須將給列設(shè)置為主鍵 primary_key=True。
2、models.CharField 字符串字段
必須 max_length 參數(shù)
3、models.BooleanField 布爾類型=tinyint(1)
不能為空,Blank=True
4、models.ComaSeparatedIntegerField 用逗號(hào)分割的數(shù)字=varchar
繼承CharField,所以必須 max_lenght 參數(shù)
5、models.DateField 日期類型 date
對(duì)于參數(shù),auto_now = True 則每次更新都會(huì)更新這個(gè)時(shí)間;auto_now_add 則只是第一次創(chuàng)建添加,之后的更新不再改變。
6、models.DateTimeField 日期類型 datetime
同DateField的參數(shù)
7、models.Decimal 十進(jìn)制小數(shù)類型 = decimal
必須指定整數(shù)位max_digits和小數(shù)位decimal_places
8、models.EmailField 字符串類型(正則表達(dá)式郵箱) =varchar
對(duì)字符串進(jìn)行正則表達(dá)式
9、models.FloatField 浮點(diǎn)類型 = double
10、models.IntegerField 整形
11、models.BigIntegerField 長整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、models.IPAddressField 字符串類型(ip4正則表達(dá)式)
13、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的)
參數(shù)protocol可以是:both、ipv4、ipv6
驗(yàn)證時(shí),會(huì)根據(jù)設(shè)置報(bào)錯(cuò)
14、models.NullBooleanField 允許為空的布爾類型
15、models.PositiveIntegerFiel 正Integer
一個(gè)整數(shù)。在Django所支持的所有數(shù)據(jù)庫中,從 -2147483648 到 2147483647 范圍內(nèi)的值是合法的。默認(rèn)的表單輸入工具是TextInput.
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 減號(hào)、下劃線、字母、數(shù)字
18、models.SmallIntegerField 數(shù)字
數(shù)據(jù)庫中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 時(shí)間 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正則表達(dá)式
22、models.BinaryField 二進(jìn)制<br>23、models.ImageField 圖片<br>24、models.FilePathField 文件
字段參數(shù)
1、null=True
數(shù)據(jù)庫中字段是否可以為空
2、blank=True
django的 Admin 中添加數(shù)據(jù)時(shí)是否可允許空值
3、primary_key = False
主鍵,對(duì)AutoField設(shè)置主鍵后,就會(huì)代替原來的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自動(dòng)創(chuàng)建---無論添加或修改,都是當(dāng)前操作的時(shí)間
auto_now_add 自動(dòng)創(chuàng)建---永遠(yuǎn)是創(chuàng)建時(shí)的時(shí)間
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 默認(rèn)值
8、verbose_name Admin中字段的顯示名稱
9、name|db_column 數(shù)據(jù)庫中的字段名稱
10、unique=True 不允許重復(fù)
11、db_index = True 數(shù)據(jù)庫索引
12、editable=True 在Admin里是否可編輯
13、error_messages=None 錯(cuò)誤提示
14、auto_created=False 自動(dòng)創(chuàng)建
15、help_text 在Admin中提示幫助信息
16、validators=[]
17、upload-to
數(shù)據(jù)庫中表與表之間的關(guān)系:
- 一對(duì)多,models.ForeignKey(ColorDic)
- 一對(duì)一,models.OneToOneField(OneModel)
- 多對(duì)多,authors = models.ManyToManyField(Author)
2、數(shù)據(jù)庫操作
在視圖里面執(zhí)行函數(shù)的時(shí)候直接創(chuàng)建
實(shí)驗(yàn)環(huán)境
class userinfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
age = models.IntegerField(max_length=12)
進(jìn)入測試環(huán)境
python manage.py shell
form fff import models
#增加
#models.userinfo.objects.create(username='aaa',password='123',age=73)
#dic = {"username":'awen',"password":'123',"age":73}
#models.userinfo.objects.create(**dic)
#刪除
#models.userinfo.objects.filter(username='awen').delete()
#models.userinfo.objects.filter(username='awen',password='123').delete()
where username='awen' and password='123'
#修改
#models.userinfo.objects.all().update(age=18)
#查找 都是userinfo的對(duì)象
#models.userinfo.objects.all()
#models.userinfo.objects.filter(age=18)
#models.userinfo.objects.filter(age=18).first()
# 獲取對(duì)象的值 從數(shù)據(jù)庫中查詢出來的結(jié)果一般是一個(gè)集合,這個(gè)集合叫做 QuerySet。
ssss=models.userinfo.objects.filter(age=18)
ssss[1].id
* 增加:創(chuàng)建實(shí)例,并調(diào)用save
* 更新:a.獲取實(shí)例,再sava;b.update(指定列)
* 刪除:a. filter().delete(); b.all().delete()
* 獲取:a. 單個(gè)=get(id=1);b. 所有 = all()
* 過濾:filter(name='xxx');filter(name__contains='');(id__in = [1,2,3]) ;
* icontains(大小寫無關(guān)的LIKE),startswith和endswith, 還有range(SQLBETWEEN查詢)'gt', 'in', 'isnull', 'endswith', 'contains', 'lt', 'startswith', 'iendswith', 'icontains','range', 'istartswith'
* 排序:order_by("name") =asc ;order_by("-name")=desc
* 返回第n-m條:第n條[0];前兩條[0:2]
* 指定映射:values
* 數(shù)量:count()
* 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
* 原始SQL
cursor = connection.cursor()
cursor.execute('''SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", ['Lennon'])
row = cursor.fetchone()
上傳文件實(shí)例
class FileForm(forms.Form):
ExcelFile = forms.FileField()
from django.db import models
class UploadFile(models.Model):
userid = models.CharField(max_length = 30)
file = models.FileField(upload_to = './upload/')
date = models.DateTimeField(auto_now_add=True)
def UploadFile(request):
uf = AssetForm.FileForm(request.POST,request.FILES)
if uf.is_valid():
upload = models.UploadFile()
upload.userid = 1
upload.file = uf.cleaned_data['ExcelFile']
upload.save()
print upload.file
六.模板
1、模版的執(zhí)行
模版的創(chuàng)建過程,對(duì)于模版,其實(shí)就是讀取模版(其中嵌套著模版標(biāo)簽),然后將 Model 中獲取的數(shù)據(jù)插入到模版中,最后將信息返回給用戶。
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)
import datetime
from django import template
import DjangoDemo.settings
now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
t = get_template('current_datetime.html')
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
注意:當(dāng)數(shù)據(jù)POST的時(shí)候,Django做了跨站請(qǐng)求偽造
2、模版語言
模板中也有自己的語言,該語言可以實(shí)現(xiàn)數(shù)據(jù)展示
{{ item }}
{% for item in item_list %} <a>{{ item }}</a> {% endfor %}
forloop.counter
forloop.first
forloop.last
{% if ordered_warranty %} {% else %} {% endif %}
母板:{% block title %}{% endblock %}
子板:{% extends "base.html" %}
{% block title %}{% endblock %}
幫助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}
通過simple_tag實(shí)現(xiàn)模版語言中的幫助方法
a、在app中創(chuàng)建templatetags文件夾
b、創(chuàng)建任意 .py 文件,如:xx.py
#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable, Node, TemplateSyntaxError
register = template.Library()
@register.simple_tag
def my_simple_time(v1,v2,v3):
@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)
c、在使用自定義simple_tag的html文件中導(dǎo)入之前創(chuàng)建的 xx.py 文件名
{% load xxx %}
d、使用simple_tag
{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}
e、再settings中配置當(dāng)前app,不然django無法找到自定義的simple_tag
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
)