django基礎(chǔ)

django介紹

Django 是用python開發(fā)的一個免費開源的Web框架溃列,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站膛薛!

django需要的一些基礎(chǔ)知識:

  1. Django是 python語言寫的一個Web框架包听隐,所以你得知道一些 Python 基礎(chǔ)知識。
  2. 其次你最好有一些做網(wǎng)站的經(jīng)驗哄啄,懂一些網(wǎng)頁 HTML, CSS, JavaScript 的知識雅任。
  3. 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': '',
    }
}
  1. 模板
TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )
  1. 靜態(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é)

  1. 靜態(tài)路由
  2. 動態(tài)路由
    按照順序,第n個匹配的數(shù)據(jù)咆霜,交給函數(shù)的第n個參數(shù)邓馒,嚴格按照順序
    模板的方法,將匹配的參數(shù)蛾坯,傳給指定的形式參數(shù)
  3. 二級路由
    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',
)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疯特,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贿堰,更是在濱河造成了極大的恐慌辙芍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羹与,死亡現(xiàn)場離奇詭異故硅,居然都是意外死亡,警方通過查閱死者的電腦和手機纵搁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門吃衅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腾誉,你說我怎么就攤上這事徘层【唬” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵趣效,是天一觀的道長瘦癌。 經(jīng)常有香客問我,道長跷敬,這世上最難降的妖魔是什么讯私? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮西傀,結(jié)果婚禮上斤寇,老公的妹妹穿的比我還像新娘。我一直安慰自己拥褂,他們只是感情好娘锁,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饺鹃,像睡著了一般莫秆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尤慰,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天馏锡,我揣著相機與錄音雷蹂,去河邊找鬼伟端。 笑死,一個胖子當著我的面吹牛匪煌,可吹牛的內(nèi)容都是我干的责蝠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼萎庭,長吁一口氣:“原來是場噩夢啊……” “哼霜医!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驳规,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肴敛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吗购,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體医男,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年捻勉,在試婚紗的時候發(fā)現(xiàn)自己被綠了镀梭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡踱启,死狀恐怖报账,靈堂內(nèi)的尸體忽然破棺而出研底,到底是詐尸還是另有隱情,我是刑警寧澤透罢,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布榜晦,位于F島的核電站,受9級特大地震影響羽圃,放射性物質(zhì)發(fā)生泄漏芽隆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一统屈、第九天 我趴在偏房一處隱蔽的房頂上張望胚吁。 院中可真熱鬧,春花似錦愁憔、人聲如沸腕扶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽半抱。三九已至,卻和暖如春膜宋,著一層夾襖步出監(jiān)牢的瞬間窿侈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工秋茫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留史简,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓肛著,卻偏偏與公主長得像圆兵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枢贿,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • MVC/MVT 框架 MVC是一種編寫代碼的邏輯上的分割模型殉农,即把代碼分為三大部分:M、V局荚、C超凳,每部分明確的負責一...
    Solomon_Xie閱讀 269評論 0 1
  • Django 準備 “虛擬環(huán)境為什么需要虛擬環(huán)境:到目前位置,我們所有的第三方包安裝都是直接通過 pip inst...
    33jubi閱讀 1,317評論 0 5
  • 自強學堂Django教程 目錄 Django是目前最流行的Python Web框架。 一茫陆、Django的MTV模式...
    CaiGuangyin閱讀 1,135評論 4 3
  • MVC框架 創(chuàng)建項目的命令 基本目錄 創(chuàng)建應用 運行服務器命令 如果增加金麸、修改、刪除文件簿盅,服務器會自動重啟挥下,按ct...
    兩分與橋閱讀 340評論 0 0
  • models.py文件揍魂,定義模型類 模型類繼承自models.Model類 生成數(shù)據(jù)表 激活模型:編輯settin...
    迷途man閱讀 370評論 0 0