下面爲django的請求生命週期html
下面來看下整個生命週期中的路由系統:前端
"""mysite_django URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^zhuce/', views.zhuce), url(r'^houtai/', views.houtai), url(r'^add/', views.add), url(r'^err/', views.err), url(r'^zichan/(\d+)/', views.zichan), url(r'^chakan/(\d+)/', views.chakan), ]
上面一個URL對應一個函數!咱們能夠在整個的url最下面裏設置一個默認的URL,當用戶訪問咱們的網站的時候沒有指定詳細的URL的時候咱們默認讓他們跳轉到一個URL。 python
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^zhuce/', views.zhuce), url(r'^houtai/', views.houtai), url(r'^add/', views.add), url(r'^err/', views.err), url(r'^zichan/(\d+)/', views.zichan), url(r'^chakan/(\d+)/', views.chakan), url(r'^$', views.index) ##正則匹配 ]
動態URL傳參,的最多使用地方以下:git
如上我夢能夠看到一些網站的分頁功能,若是不是動態的那麼當分頁不少時咱們就得寫對應數量的url,可是這裏時支持正則表達式的。咱們能夠這樣寫(其實上面例子中已經寫出了):ajax
url(r'^zichan/(\d+)/', views.zichan), url(r'^chakan/(\d+)/', views.chakan),
對應的函數以下:這樣咱們就實現了一個url和函數的對應(如下函數着重看參數便可):正則表達式
def chakan(request,nid): current_detail_dict = models.HostsInfo.objects.filter(id=nid) return render(request, 'chakan.html', {'current_detail_dict': current_detail_dict}) def zichan(request,page): USER_LIST = [] # for item in range(94): # temp = {"id": item, 'username': 'alex' + str(item), 'email': 'email' + str(item)} # USER_LIST.append(temp) data_list = models.HostsInfo.objects.all() for item in data_list: temp = {"id": item.id, 'zhujiming': item.zhujiming, 'ip': item.ip} USER_LIST.append(temp) print("sdfsdfsd") # return HttpResponse('ok') print(page) # 1,0-9 # 2,10-19 # 3,20-29 page = int(page) start = (page - 1) * 10 end = page * 10 user_list = USER_LIST[start:end] if page ==1: page_shang=1 else: page_shang=page-1 data = {"user_list" : user_list,"page_xia":page+1,"page_shang":page_shang,"page":page,} # return HttpResponse('OK') # print(data[1]) # print(data[0]) return render(request, 'zichan.html', {'data': data})
他這裏會作兩步操做:sql
一、獲取user_list後面的這個值數據庫
二、運行views.user_list這個函數,並把獲取的值自動傳給views.user_list做爲參數他的參數django
動態URL傳多個參數json
能夠傳多個參數它是以/來分割的。
url(r'^user_list/(\d+)/(\d+)$', views.user_list),
views.user_list
def user_list(request,chose_id,chose_id2): return HttpResponse(chose_id+chose_id2)
他的順序是:正序的,你先給他傳那個值,第一個參數就是那個
下面來看一個無序的:
動態URL傳參數以Key:value的形式經過正則表達式的分組來作!
url(r'^user_list/(?P<v1>\d+)/(?P<V2>\d+)$', views.user_list),
這裏?p<v1>這裏的v1就是key,vlaue就是傳進去的值,
def user_list(request,v2,v1): print v2 , v1 return HttpResponse(v1+v2)
這樣咱們就沒必要按照順序去取了,能夠經過key,value的方式來取傳進來的值!!
模版的建立過程,對於模版,其實就是讀取模版(其中嵌套着模版標籤),而後將 Model 中獲取的數據插入到模版中,最後將信息返回給用戶。
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))
模板中也有本身的語言,該語言能夠實現數據展現
a、在app中建立templatetags模塊
b、建立任意 .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): return v1 + v2 + v3 @register.simple_tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
c、在使用自定義simple_tag的html文件中導入以前建立的 xx.py 文件名
{% load xx %}
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', )
<script src="/static/js/commons.js"></script> <script> $(function(){ $.valid('#form1'); }); function SubmitForm() { $.ajax({ url: '/index/', type: 'POST', data: {'username':$('#username').val(),'password':$('#password').val()}, #獲取表單的數據 success: function (data) { if (data == '1'){ #這裏的data是後端的返回值 location.href = "/zichan/1" }else { alert('用戶名or密碼錯誤') } } }) } </script>
對應的後端驗證以下:
def index(request): ''' index 界面請求處理,主要作用戶數據的驗證,驗證成功後作後端的跳轉。 :param request: 傳遞的參數。 :return:返回給前端 ''' #return HttpResponse("<h1>zhaowencheng</h1>") if (request.method == 'POST'): u = request.POST.get('username',None) pa = request.POST.get('password',None) if int(len(u)) == 0 or int(len(pa)) == 0: pass else: data_list = models.UserInfo.objects.all() for i in data_list: if u == i.username and pa == i.password: print("登陸成功") #return redirect('/houtai/') return HttpResponse('1') else: return HttpResponse('0') # info = 2 return render(request,'index.html')
#不規範的示例 def ajax_data(request): print request.POST return HttpResponse('OK') 應該這麼寫:(下面的例子先用json來作,不過還有一個json response) import json def ajax_data(request): ret = {'status':True,'error':''} try: print request.POST except Exception,e: ret['status'] = False ret['error'] = str(e) #在上面若是他出錯我就把他ret[status] = False return HttpResponse(json.dumps(ret))
到目前爲止,當咱們的程序涉及到數據庫相關操做時,咱們通常都會這麼搞:
import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='cheng', passwd='1234', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchall() db.close() return data def GetSingle(sql): db = MySQLdb.connect(user='root', db='cheng', passwd='1234', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchone() db.close() return data
django爲使用一種新的方式,即:關係對象映射(Object Relational Mapping,簡稱ORM)。
PHP:activerecord
Java:Hibernate
C#:Entity Framework
django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動生成數據庫表。
一、建立Model,以後能夠根據Model來建立數據庫表
from django.db import models class userinfo(models.Model): name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField()
更多的參考表字段:*****
一、models.AutoField 自增列 = int(11) 若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。 2、models.CharField 字符串字段 必須 max_length 參數 三、models.BooleanField 布爾類型=tinyint(1) 不能爲空,Blank=True 四、models.ComaSeparatedIntegerField 用逗號分割的數字=varchar 繼承CharField,因此必須 max_lenght 參數 5、models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。 6、models.DateTimeField 日期類型 datetime 同DateField的參數 七、models.Decimal 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places 八、models.EmailField 字符串類型(正則表達式郵箱) =varchar 對字符串進行正則表達式 九、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是可選的) 參數protocol能夠是:both、ipv四、ipv6 驗證時,會根據設置報錯 14、models.NullBooleanField 容許爲空的布爾類型 15、models.PositiveIntegerFiel 正Integer 16、models.PositiveSmallIntegerField 正smallInteger 17、models.SlugField 減號、下劃線、字母、數字 18、models.SmallIntegerField 數字 數據庫中的字段有:tinyint、smallint、int、bigint 1九、models.TextField 字符串=longtext 20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]] 21、models.URLField 字符串,地址正則表達式 22、models.BinaryField 二進制 23、models.ImageField 圖片 24、models.FilePathField 文件 更多字段
更多的參考參數:
一、null=True 數據庫中字段是否能夠爲空 二、blank=True django的 Admin 中添加數據時是否可容許空值 三、primary_key = False 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列 4、auto_now 和 auto_now_add auto_now 自動建立---不管添加或修改,都是當前操做的時間 auto_now_add 自動建立---永遠是建立時的時間 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中字段的顯示名稱 九、name|db_column 數據庫中的字段名稱 十、unique=True 不容許重複 十一、db_index = True 數據庫索引 十二、editable=True 在Admin裏是否可編輯 1三、error_messages=None 錯誤提示 1四、auto_created=False 自動建立 15、help_text 在Admin中提示幫助信息 1六、validators=[] 1七、upload-to 更多參數
二、連表關係:
三、數據庫操做
文件上傳實例:
#Form class FileForm(forms.Form): ExcelFile = forms.FileField() #model 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) #views 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 View