1. 程式人生 > 其它 >1.3 約定程式設計Spring AOP

1.3 約定程式設計Spring AOP

python_web

Django 有哪些應用?

  • admin:管理站點。
  • auth:許可權框架。
  • contenttypes:內容型別的框架。
  • sessions:會話(session)框架。
  • messages:訊息框架。
  • staticfiles:用來管理靜態檔案的框架
  • 一個blog,wiki或者論壇應用包含有四個組合:
    • 模型(models)
    • 檢視(views)
    • 模板(templates)
    • URLs

python環境配置(假設當前目錄為ty):

  • Ubuntu:sudo apt install python3-pip && pip3 install virtualenv && mkdir env && virtualenv env/python_web && source env/python_web/bin/activate
    檢視及進入編譯環境:pip3 list && python3
  • Windows類似,官網下載安裝包,安裝介面上自定義安裝即可,https://www.python.org/downloads/windows/
    驗證語句:python -V

常用命令(啟用python環境):
django-admin startproject my && cd my && django-admin startapp blog
在 blog 應用下的 models.py 檔案中新增設計初始的資料模型POST(Django內建了許多欄位)
編輯 settings.py 檔案,在 INSTALLED_APPS 設定新增應用blog
啟用應用具體需要執行以下命令(包括建立和進行資料庫遷移兩個步驟,Django能保持跟蹤應用並且根據模型(models)來建立資料庫表):

  • python manage.py makemigrations blog#允許 Django 來保持對模型(model)blog改變的跟蹤
  • python manage.py migrate#保持資料庫與我們的模型(models)同步

管理站點根據模型(model)元資料進行動態構建並且提供一個可讀的介面來編輯內容(Django 內建),可自由定製模型的顯示
管理站點需要執行以下命令:

  • python manage.py createsuperuser#輸入你想要的使用者名稱,郵箱和密碼

Post 模型(model)和 User(model)關聯在了一起,它們是通過 author 欄位進行關聯的
編輯 blog 應用下的 admin.py 檔案,在管理站點中新增模型:

  • from django.contrib import admin
  • from .models import Post
  • admin.site.register(Post)

瀏覽器http://127.0.0.1:8000/admin/中重新整理管理站點會看到Post 模型(model)在頁面中展示
Django 會通過對模型進行內省後,提供一個非常友好有用的介面,這個介面允許排列,編輯,建立,以及刪除物件。
定製 models 的展示形式。編輯 blog 應用下的 admin.py 檔案

  • class PostAdmin(admin.ModelAdmin):
    • list_display = ('title', 'slug', 'author', 'publish','status')#帖子列頁面
    • list_filter = ('status', 'created', 'publish', 'author')#根據指定的欄位來過濾返回結果
    • search_fields = ('title', 'body')#搜尋欄位列
    • prepopulated_fields = {'slug': ('title',)}#告訴 Django 通過輸入的標題來填充 slug 欄位
    • raw_id_fields = ('author',)
    • date_hierarchy = 'publish'#通過時間層快速導航的欄
    • ordering = ['status', 'publish']#使用 ordering 屬性指定了預設排序
  • admin.site.register(Post, PostAdmin)#繼承ModelAdmin定製類PostAdmin註冊我們POST模型

Django 自帶資料庫API可以建立,檢索,更新以及刪除物件。ORM操作可以相容 MySQL,PostgreSQL,SQLite以及 Oracle。
Object-relational mapping(ORM),Java典型的ORM中介軟體有:Hibernate,ibatis,speedframework。django預設採用的是orm框架中的codefirst模型
使用模型(models)的objects管理器(manager)的all()方法就能獲得一個查詢集(QuerySet)物件

  • all_posts = Post.objects.all()

使用 create()方法直接在資料庫中建立物件

  • Post.objects.create(title='One more post', slug='one-more-post',body='Post body.', author=user)

更新物件

  • post = Post(title='Another post', slug='another-post', body='Postbody.', author=user)
  • post.title = 'New title'
  • post.save()

使用 filter()方法過濾查詢集

  • Post.objects.filter(publish__year=20155, author__username='admin')

使用 exclude()排除某些返回結果

  • Post.objects.filter(publish__year=2015).exclude(title__startswith='Why')

使用 order_by()對不同的欄位進行排序(降序)

  • Post.objects.order_by('-title')

刪除物件

  • post = Post.objects.get(id=1)
  • post.delete()

以上是是模型的預設管理器objects,為進一步自定義定製管理器。編輯models.py 檔案
class PublishedManager(models.Manager):

  • def get_queryset(self):
    • return super(PublishedManager,self).get_queryset().filter(status='published')
      在Shell中執行它:
  • Post.published.filter(title__startswith='Who')

檢視(view)的呼叫就是得到一個 web 請求並且返回一個 web 響應,View 類可以操控 HTTP 方法排程以及其他的功能
上一模組總Shell中執行是不方便的,因此需要直接構建列和詳情檢視(views),建立views.py 檔案(檢視都有需要request這個引數),新增第一個檢視(view)
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.published.all()
return render(request,'blog/post/list.html',{'posts': posts})#快捷方法 render()通過給予的模板(template)來渲染帖子列,返回HttpResponse 物件
第二個檢視(view)來展示一篇單獨的帖子詳情檢視
def post_detail(request, year, month, day, post):#通過給予 slug 和日期來獲取到一篇已經發布的帖子
post = get_object_or_404(Post, slug=post,status='published',publish__year=year,publish__month=month,publish__day=day)#slug欄位添加了 unique_for_date 引數,一天內不能有同名的文章。檢索期望的 Post,當沒有匹配的物件時返回一個 HTTP 404(Not found)異常
return render(request,'blog/post/detail.html',{'post': post})

URL模式是由一個 Python 正則表達,一個檢視(view),一個全專案範圍內的命名組成。為檢視新增URL模式,建立urls.py檔案:
from django.conf.urls import url
from . import views
urlpatterns = [# post views
url(r'^$', views.post_list, name='post_list'),#對映到post_list檢視
url(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P[-\w]+)/$',views.post_detail,name='post_detail'),#對映到 post_detail 檢視
]
將blog 中的 URL 模式包含到專案的主 URL 模式中
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^blog/', include('blog.urls',namespace='blog',app_name='blog')),#在 blog/路徑下包含了 blog 應用中定義的 URL 模式
]

給模型新增 get_absolute_url()方法用來返回一個物件的標準 URL
from django.core.urlresolvers import reverse
Class Post(models.Model):
def get_absolute_url(self):
return reverse('blog:post_detail',args=[self.publish.year,self.publish.strftime('%m'),self.publish.strftime('%d'),self.slug])
為檢視(views)建立模板(templates),模板(templates)語言
base.html 檔案將會包含站點主要的 HTML 結構以及分割內容區域和一個導航欄。 list.html 和 detail.html 檔案會繼承 base.html 檔案來渲染各自的 blog帖子列和詳情檢視
{% load staticfiles %}
{% extends "blog/base.html" %}
{% extends "blog/base.html" %}

Paginator 類允許你方便的管理分頁,編輯檢視檔案的post_list類
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def post_list(request):
object_list = Post.published.all()
paginator = Paginator(object_list, 3)
page = request.GET.get('page')#page GET 引數來指明頁數
try:
posts = paginator.page(page)#獲得Paginator類物件
except PageNotAnInteger:
posts = paginator.page(1)#第一頁
except EmptyPage:
posts = paginator.page(paginator.num_pages)#最後一頁
return render(request,'blog/post/list.html',{'page': page,'posts': posts})#傳遞頁數並且獲取物件給模板(template)中的blog/post/list.html........
建立一個模板pagination.html來展示分頁處理
為了渲染上一頁與下一頁的連結並且展示當前頁面和所有頁面的結果,這個分頁模板(template)需要將 pagination.html 模板包含在 {% content %} 區塊中
{% include "pagination.html" with page=posts %}
Page 物件叫做 posts,可以反覆使用,分頁模板(template)可以對不同的模型(models)檢視(views)進行分頁處理........

自定義檢視下節再繼續........