Web架構Django基礎

來源:互聯網
上載者:User

標籤:終端   library   include   設定   amd   target   模板   命名   結束   

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

一、基本配置

1、建立django程式

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

其他常用命令:

  python manage.py runserver 0.0.0.0
  python manage.py startapp appname
  python manage.py syncdb
  python manage.py makemigrations
  python manage.py migrate

  python manage.py createsuperuser

 

2、程式目錄

 

3、設定檔

3.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 pymysqlpymysql.install_as_MySQLdb() 

3.2 模版

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

3.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})

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

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

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

6、命名空間

6.1  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‘)),]

6.2  app01.urls.py

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

6.3  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請求做一條路由映射,從而是路由系統變得簡潔。

通過反射機制,為django開發一套動態路由系統Demo: 點擊下載

 

 

 

三、模板

1、模版的執行

模版的建立過程,對於模版,其實就是讀模數版(其中嵌套著模版標籤),然後將 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 templatet = template.Template(‘My name is {{ name }}.‘)c = template.Context({‘name‘: ‘Adrian‘})print t.render(c)

  

import datetimefrom django import templateimport 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_templatefrom django.template import Contextfrom django.http import HttpResponseimport 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))

  

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-8from django import templatefrom django.utils.safestring import mark_safe   register = template.Library()   @register.simple_tagdef my_simple_time(v1,v2,v3):    return  v1 + v2 + v3   @register.simple_tagdef my_input(id,arg):    result = "<input type=‘text‘ id=‘%s‘ class=‘%s‘ />" %(id,arg,)    return mark_safe(result)

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

更多見文檔:https://docs.djangoproject.com/en/1.10/ref/templates/language/

 

 

 

四、中介軟體

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

在django項目的settings模組中,有一個 MIDDLEWARE_CLASSES 變數,其中每一個元素就是一個中介軟體,如。

與mange.py在同一目錄下的檔案夾 wupeiqi/middleware下的auth.py檔案中的Authentication類

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

  • 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對象,則直接將該對象返回給使用者。

自訂中介軟體

1、建立中介軟體類

class RequestExeute(object):          def process_request(self,request):        pass    def process_view(self, request, callback, callback_args, callback_kwargs):        i =1        pass    def process_exception(self, request, exception):        pass          def process_response(self, request, response):        return response

2、註冊中介軟體

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‘,    ‘wupeiqi.middleware.auth.RequestExeute‘,)

 

 

 

 

五、admin

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

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

1、建立後台管理員

python manage.py createsuperuser

2、配置後台管理url

url(r‘^admin/‘, include(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)

b、設定資料表名稱

class UserType(models.Model):    name = models.CharField(max_length=50)      class Meta:        verbose_name = ‘使用者類型‘        verbose_name_plural = ‘使用者類型‘

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

class UserType(models.Model):    name = models.CharField(max_length=50)      def __unicode__(self):        return self.name

  

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)

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)

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)

 

 

 

Web架構Django基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.