django介紹
Django 是用python開發(fā)的一個免費開源的Web框架溃列,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站膛薛!
django需要的一些基礎(chǔ)知識:
- Django是 python語言寫的一個Web框架包听隐,所以你得知道一些 Python 基礎(chǔ)知識。
- 其次你最好有一些做網(wǎng)站的經(jīng)驗哄啄,懂一些網(wǎng)頁 HTML, CSS, JavaScript 的知識雅任。
- socket(套接字)或者網(wǎng)絡方面的知識點
沒有經(jīng)驗也沒有關(guān)系风范,慢慢來就好了,你一定可以學會沪么,Django 很簡單硼婿!
django 框架基礎(chǔ)
- Model(模型):負責業(yè)務對象與數(shù)據(jù)庫的對象(ORM)
- Template(模版):負責如何把頁面展示給用戶
- View(視圖):負責業(yè)務邏輯,并在適當?shù)臅r候調(diào)用Model和Template
- URL Django還有一個url分發(fā)器禽车,它的作用是將一個個URL的頁面請求分發(fā)給不同的view處理寇漫,view再調(diào)用相應的Model和Template index index
- 其他ajax
對python web程序來說,一般會分為兩部分:服務器程序和應用程序殉摔。服務器程序負責對socket服務器進行封裝州胳,并在請求到來時,對請求的各種數(shù)據(jù)進行整理逸月。應用程序則負責具體的邏輯處理陋葡。為了方便應用程序的開發(fā),就出現(xiàn)了眾多的Web框架彻采,例如:Django腐缤、Flask、web.py 等肛响。不同的框架有不同的開發(fā)方式岭粤,但是無論如何,開發(fā)出的應用程序都要和服務器程序配合特笋,才能為用戶提供服務剃浇。這樣,服務器程序就需要為不同的框架提供不同的支持猎物。這樣混亂的局面無論對于服務器還是框架虎囚,都是不好的。對服務器來說蔫磨,需要支持各種不同框架淘讥,對框架來說,只有支持它的服務器才能被開發(fā)出的應用使用堤如。這時候蒲列,標準化就變得尤為重要。我們可以設立一個標準搀罢,只要服務器程序支持這個標準蝗岖,框架也支持這個標準,那么他們就可以配合使用榔至。一旦標準確定抵赢,雙方各自實現(xiàn)。這樣,服務器可以支持更多支持標準的框架铅鲤,框架也可以使用更多支持標準的服務器划提。
在做驗證的時候
前后端交付
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之間接口格式,實現(xiàn)web app與web server間的解耦袜漩。
django是怎么工作的
python標準庫提供的獨立WSGI服務器稱為wsgiref绪爸。
一、創(chuàng)建django程序
1宙攻、終端:django-admin startproject sitename
2奠货、IDE創(chuàng)建Django程序時,本質(zhì)上都是自動執(zhí)行上述命令
常用命令:
python manage.py runserver 0.0.0.0 啟動django項目
python manage.py startapp appname 創(chuàng)建一個djangoapp
python manage.py syncdb 同步數(shù)據(jù)庫 1.7.4之前的版本
python manage.py makemigrations 基于當前的model創(chuàng)建新的遷移策略文件 簡單來說 就是生成sql
python manage.py migrate 用于執(zhí)行遷移動作 執(zhí)行sql
python manage.py createsuperuser 創(chuàng)建第一個用戶
二座掘、Django程序目錄
setting: 全局的配置文件
urls: 一個URL對應一個視圖函數(shù)
wsgi: web服務網(wǎng)關(guān)接口 創(chuàng)建socket對象
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递惋、每個路由規(guī)則對應一個view中的函數(shù)
#動態(tài)路由 查看第一頁內(nèi)容 查看第二個內(nèi)容
url(r'^news/(\d*)(\d*)', views.news), #添加一個匹配數(shù)字的 ()分組匹配
#獲取這個值有什么用類 我們可以根據(jù)這個值來獲取數(shù)據(jù) 所有的正則表達式都是支持的
#?P<name> 指定形式參數(shù)的名字 可以通過名字來調(diào)用
#我們可以指定位置來獲取數(shù)據(jù) 而不是按照傳進來的參數(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對路由規(guī)則進行一次分類
#二級路由
url(r'^web/',include('web.urls')),
django中的路由系統(tǒng)和其他語言的框架有所不同溢陪,在django中每一個請求的url都要有一條路由映射萍虽,這樣才能將請求交給對一個的view中的函數(shù)去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射形真,從而是路由系統(tǒng)變得簡潔杉编。
總結(jié)
- 靜態(tài)路由
- 動態(tài)路由
按照順序,第n個匹配的數(shù)據(jù)咆霜,交給函數(shù)的第n個參數(shù)邓馒,嚴格按照順序
模板的方法,將匹配的參數(shù)蛾坯,傳給指定的形式參數(shù) - 二級路由
ceshi.url.py 首先在ceshiapp里面定義一個urls文件 寫法跟urls一樣的
include(ceshi.url) 然后在project里面定義一個includeceshiapp下面的urls
然后在用戶訪問ceshiapp的時候會進行一個轉(zhuǎn)發(fā)的功能
五. 模型
到目前為止光酣,當我們的程序涉及到數(shù)據(jù)庫相關(guān)操作時一般做一下幾個操作:
- 創(chuàng)建數(shù)據(jù)庫,設計表結(jié)構(gòu)和字段
- 使用 MySQLdb 來連接數(shù)據(jù)庫脉课,并編寫數(shù)據(jù)訪問層代碼
- 業(yè)務邏輯層去調(diào)用數(shù)據(jù)訪問層執(zhí)行數(shù)據(jù)庫操作
django為使用一種新的方式航唆,即:關(guān)系對象映射(Object Relational Mapping,簡稱ORM)低滩。 code frist 代碼優(yōu)先
自己寫類 --> 數(shù)據(jù)庫表
默認支持admin后臺登錄 如果輸入用戶名密碼 它是不是要進行比較 它進行比較是不是跟某一個數(shù)據(jù)庫里面的某一個字段進行比較
django自己創(chuàng)建表 并且知道表的結(jié)構(gòu) 有數(shù)據(jù)的支撐 django默認會創(chuàng)建幾張表
配置數(shù)據(jù)庫在settings里面
默認不配置的情況下會放到sqllite3
生產(chǎn)數(shù)據(jù)庫需要執(zhí)行命令 1. makemigrations #生成配置文件
2. migrate #根據(jù)配置文件創(chuàng)建數(shù)據(jù)庫相關(guān)
django中遵循 Code Frist 的原則采驻,即:根據(jù)代碼中定義的類來自動生成數(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)
如果沒有的話,默認會生成一個名稱為 id 的列跌穗,如果要顯示的自定義一個自增列订晌,必須將給列設置為主鍵 primary_key=True。
2蚌吸、models.CharField 字符串字段
必須 max_length 參數(shù)
3锈拨、models.BooleanField 布爾類型=tinyint(1)
不能為空,Blank=True
4羹唠、models.ComaSeparatedIntegerField 用逗號分割的數(shù)字=varchar
繼承CharField奕枢,所以必須 max_lenght 參數(shù)
5、models.DateField 日期類型 date
對于參數(shù)佩微,auto_now = True 則每次更新都會更新這個時間缝彬;auto_now_add 則只是第一次創(chuàng)建添加,之后的更新不再改變哺眯。
6谷浅、models.DateTimeField 日期類型 datetime
同DateField的參數(shù)
7、models.Decimal 十進制小數(shù)類型 = decimal
必須指定整數(shù)位max_digits和小數(shù)位decimal_places
8奶卓、models.EmailField 字符串類型(正則表達式郵箱) =varchar
對字符串進行正則表達式
9一疯、models.FloatField 浮點類型 = 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正則表達式)
13、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的)
參數(shù)protocol可以是:both瑟幕、ipv4磕蒲、ipv6
驗證時,會根據(jù)設置報錯
14只盹、models.NullBooleanField 允許為空的布爾類型
15辣往、models.PositiveIntegerFiel 正Integer
一個整數(shù)。在Django所支持的所有數(shù)據(jù)庫中殖卑,從 -2147483648 到 2147483647 范圍內(nèi)的值是合法的站削。默認的表單輸入工具是TextInput.
16、models.PositiveSmallIntegerField 正smallInteger
17孵稽、models.SlugField 減號许起、下劃線、字母菩鲜、數(shù)字
18园细、models.SmallIntegerField 數(shù)字
數(shù)據(jù)庫中的字段有:tinyint、smallint接校、int猛频、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]
21睦柴、models.URLField 字符串,地址正則表達式
22毡熏、models.BinaryField 二進制<br>23坦敌、models.ImageField 圖片<br>24痢法、models.FilePathField 文件
字段參數(shù)
1疯暑、null=True
數(shù)據(jù)庫中字段是否可以為空
2、blank=True
django的 Admin 中添加數(shù)據(jù)時是否可允許空值
3越锈、primary_key = False
主鍵,對AutoField設置主鍵后,就會代替原來的自增 id 列
4火邓、auto_now 和 auto_now_add
auto_now 自動創(chuàng)建---無論添加或修改丹弱,都是當前操作的時間
auto_now_add 自動創(chuàng)建---永遠是創(chuàng)建時的時間
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 默認值
8、verbose_name Admin中字段的顯示名稱
9纤勒、name|db_column 數(shù)據(jù)庫中的字段名稱
10坯苹、unique=True 不允許重復
11、db_index = True 數(shù)據(jù)庫索引
12摇天、editable=True 在Admin里是否可編輯
13粹湃、error_messages=None 錯誤提示
14、auto_created=False 自動創(chuàng)建
15泉坐、help_text 在Admin中提示幫助信息
16为鳄、validators=[]
17、upload-to
數(shù)據(jù)庫中表與表之間的關(guān)系:
- 一對多腕让,models.ForeignKey(ColorDic)
- 一對一孤钦,models.OneToOneField(OneModel)
- 多對多,authors = models.ManyToManyField(Author)
2、數(shù)據(jù)庫操作
在視圖里面執(zhí)行函數(shù)的時候直接創(chuàng)建
實驗環(huán)境
class userinfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
age = models.IntegerField(max_length=12)
進入測試環(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的對象
#models.userinfo.objects.all()
#models.userinfo.objects.filter(age=18)
#models.userinfo.objects.filter(age=18).first()
# 獲取對象的值 從數(shù)據(jù)庫中查詢出來的結(jié)果一般是一個集合司训,這個集合叫做 QuerySet构捡。
ssss=models.userinfo.objects.filter(age=18)
ssss[1].id
* 增加:創(chuàng)建實例,并調(diào)用save
* 更新:a.獲取實例壳猜,再sava勾徽;b.update(指定列)
* 刪除:a. filter().delete(); b.all().delete()
* 獲取:a. 單個=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()
上傳文件實例
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)建過程吹由,對于模版,其實就是讀取模版(其中嵌套著模版標簽)朱嘴,然后將 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))
注意:當數(shù)據(jù)POST的時候萍嬉,Django做了跨站請求偽造
2乌昔、模版語言
模板中也有自己的語言,該語言可以實現(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實現(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文件中導入之前創(chuàng)建的 xx.py 文件名
{% load xxx %}
d溺蕉、使用simple_tag
{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}
e、再settings中配置當前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',
)