1. 程式人生 > >小試牛刀之Django

小試牛刀之Django

Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其他WEB框架其優勢為:大而全,框架本身集成了ORM、模型繫結、模板引擎、快取、Session等諸多功能。

基本配置

一、建立django程式

  • 終端命令:django-admin startproject sitename
  • IDE建立Django程式時,本質上都是自動執行上述命令

其他常用的命令:

  • python manage.py runserver 8080  啟動
  • python manage.py startapp appname  建立app
  • python manage.py syncbd
  • python manage.py makemigrations 建立表格
  • python manage.py migrate
  • python manage.py create superuser 建立後臺管理員

二、程式目錄

三、配置檔案

settings.py中

1.資料庫

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}
# 由於Django內部連線MySQL時使用的是MySQLdb模組,而python3中還無此模組,所以需要使用pymysql來代替
# 如下設定放置的與project同名的配置的 __init__.py檔案中 import pymysql pymysql.install_as_MySQLdb() 
View Code

2.模版

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )

3.靜態檔案

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )

路由系統

1.單一路由對應

url(r'^index$', views.index),

2.基於正則的路由

url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

3.新增額外的引數

url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

4.為路由對映設定名稱

url(r'^home', views.home, name='h1'),
url(r'^index/(\d*)', views.index, name='h2'),

設定名稱之後,可以在不同的地方呼叫,如:

  • 模板中使用生成URL     {% url 'h2' 2012 %}
  • 函式中使用生成URL     reverse('h2', args=(2012,))      路徑:django.urls.reverse
  • Model中使用獲取URL  自定義get_absolute_url() 方法
class NewType(models.Model):
    caption = models.CharField(max_length=16)


    def get_absolute_url(self):
        """
        為每個物件生成一個URL
        應用:在物件列表中生成檢視詳細的URL,使用此方法即可!!!
        :return:
        """
        # return '/%s/%s' % (self._meta.db_table, self.id)
        #
        from django.urls import reverse
        return reverse('NewType.Detail', kwargs={'nid': self.id})
View Code

獲取請求匹配成功的URL資訊:request.resolver_match

5.根據app對路由規則進行分類

url(r'^web/',include('web.urls')),

6.名稱空間

a. project.urls.py

from django.conf.urls import url,include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views
 
app_name = 'app01'
urlpatterns = [
    url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

以上定義帶名稱空間的url之後,使用name生成URL時候,應該如下:

  • v = reverse('app01:detail', kwargs={'pk':11})
  • {% url 'app01:detail' pk=12 pp=99 %}

django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由對映,這樣才能將請求交給對一個的view中的函式去處理。其他大部分的Web框架則是對一類的url請求做一條路由對映,從而是路由系統變得簡潔。

路由系統

1、模版的執行

模版的建立過程,對於模版,其實就是讀取模版(其中巢狀著模版標籤),然後將 Model 中獲取的資料插入到模版中,最後將資訊返回給使用者。

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
View Code
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print(t.render(c))
View Code
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)
View Code
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)
View Code
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
View Code

2、模版的語言

模板中也有自己的語言,該語言可以實現資料展示

  • {{ 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 }}

3、自定義simple_tag

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
   
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,)
    return mark_safe(result)
View Code

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',
)

中介軟體

django 中的中介軟體(middleware),在django中,中介軟體其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中介軟體中相應的方法。

在django專案的settings模組中,有一個 MIDDLEWARE_CLASSES 變數,其中每一個元素就是一箇中間件

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

中介軟體中可以定義四個方法,分別是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

以上方法的返回值可以是None和HttpResonse物件,如果是None,則繼續按照django定義的規則向下執行,如果是HttpResonse物件,則直接將該物件返回給使用者。

admin

django amdin是django提供的一個後臺管理頁面,改管理頁面提供完善的html和css,使得你在通過Model建立完資料庫表之後,就可以對資料進行增刪改查,而使用django admin 則需要以下步驟:

  • 建立後臺管理員
  • 配置url
  • 註冊和配置django admin後臺管理頁面

1、建立後臺管理員

python manage.py createsuperuser

2、配置後臺管理url

url(r'^admin/', admin.site.urls),

3、註冊和配置django admin 後臺管理頁面

a、在admin中執行如下配置

from django.contrib import admin
  
from app01 import  models
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code

b、設定資料表名稱

class UserType(models.Model):
    name = models.CharField(max_length=50)
  
    class Meta:
        verbose_name = '使用者型別'
        verbose_name_plural = '使用者型別'
View Code

c、開啟表之後,設定預設顯示,需要在model中作如下配置

class UserType(models.Model):
    name = models.CharField(max_length=50)
  
    def __str__(self):
        return self.name
View Code
from django.contrib import admin
  
from app01 import  models
  
class UserInfoAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'email')
  
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code

d、為資料表新增搜尋功能

from django.contrib import admin
  
from app01 import  models
  
class UserInfoAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'email')
    search_fields = ('username', 'email')
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code

e、新增快速過濾

from django.contrib import admin
  
from app01 import  models
  
class UserInfoAdmin(admin.ModelAdmin):
    list_display = ('username', 'password', 'email')
    search_fields = ('username', 'email')
    list_filter = ('username', 'email')
      
  
  
admin.site.register(models.UserType)
admin.site.register(models.UserInfo,UserInfoAdmin)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
View Code