Django开发准则与最佳实践
最近在網易云課堂學習一門django高級實戰教程,本文是學習課時14、15的一些筆記
Django開發準則與最佳實踐
一、優先使用自定義用戶模型
繼承BaseUserManager和AbstractBaseUser,指定AUTH_USER_MODEL配置項
看一下cookiecutter給我們生成的項目結構下的mydjango/users/models.py
 自定義的User繼承了AbstractUser
AbstractUser里的定義(~/anaconda3/envs/djg22env/lib/python3.7/site-packages/django/contrib/auth/base.py)
class AbstractUser(AbstractBaseUser, PermissionsMixin):"""An abstract base class implementing a fully featured User model withadmin-compliant permissions.Username and password are required. Other fields are optional."""username_validator = UnicodeUsernameValidator()username = models.CharField(_('username'),max_length=150,unique=True,help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),validators=[username_validator],error_messages={'unique': _("A user with that username already exists."),},)first_name = models.CharField(_('first name'), max_length=30, blank=True)last_name = models.CharField(_('last name'), max_length=150, blank=True)email = models.EmailField(_('email address'), blank=True)is_staff = models.BooleanField(_('staff status'),default=False,help_text=_('Designates whether the user can log into this admin site.'),)is_active = models.BooleanField(_('active'),default=True,help_text=_('Designates whether this user should be treated as active. ''Unselect this instead of deleting accounts.'),)date_joined = models.DateTimeField(_('date joined'), default=timezone.now)objects = UserManager()EMAIL_FIELD = 'email'USERNAME_FIELD = 'username'REQUIRED_FIELDS = ['email']class Meta:verbose_name = _('user')verbose_name_plural = _('users')abstract = Truedef clean(self):super().clean()self.email = self.__class__.objects.normalize_email(self.email)def get_full_name(self):"""Return the first_name plus the last_name, with a space in between."""full_name = '%s %s' % (self.first_name, self.last_name)return full_name.strip()def get_short_name(self):"""Return the short name for the user."""return self.first_namedef email_user(self, subject, message, from_email=None, **kwargs):"""Send an email to this user."""send_mail(subject, message, from_email, [self.email], **kwargs)已經有username ,first_name,last_name,email,is_staff,is_active,date_joined這些字段,所以我們自己定義User的時候,繼承AbstractUser,然后加入另外的字段就行了。再通過config/settings/base.py中的AUTH_USER_MODEL = "users.User"將自己定義的User指定上去
 原本默認的User是這個
 (~/anaconda3/envs/djg22env/lib/python3.7/site-packages/django/contrib/auth/base.py)
二、使用通用類視圖FBV->CBV->CBGV
繼承CreateView,UpdateView,ListView,DetailView,DeleteView
 官方文檔-基于類的視圖
基于類的視圖
基于類的視圖提供另一種將視圖實現為 Python 對象而不是函數的方法。它們不能替代基于函數的視圖,但與基于函數的視圖相比,它們是有某些不同和優勢的。
 與特定的 HTTP 方法(GET, POST, 等等)關聯的代碼組織能通過單獨的方法替代條件分支來解決。
 面向對象技術(比如 mixins 多重繼承)可用于將代碼分解為可重用組件。
基于類的視圖允許你使用不同的類實例方法響應不同 HTTP 請求方法
from django.http import HttpResponse from django.views import Viewclass MyView(View):def get(self, request):# <view logic>return HttpResponse('result')使用基于類的視圖處理表單
from django.http import HttpResponseRedirect from django.shortcuts import render from django.views import Viewfrom .forms import MyFormclass MyFormView(View):form_class = MyForminitial = {'key': 'value'}template_name = 'form_template.html'def get(self, request, *args, **kwargs):form = self.form_class(initial=self.initial)return render(request, self.template_name, {'form': form})def post(self, request, *args, **kwargs):form = self.form_class(request.POST)if form.is_valid():# <process form cleaned data>return HttpResponseRedirect('/success/')return render(request, self.template_name, {'form': form})基于類的通用視圖
具體請參考官方文檔
 Django 附帶一些內置的通用視圖,它們生成列表和對象的詳情視圖極為方便。
模型
# models.py from django.db import modelsclass Publisher(models.Model):name = models.CharField(max_length=30)address = models.CharField(max_length=50)city = models.CharField(max_length=60)state_province = models.CharField(max_length=30)country = models.CharField(max_length=50)website = models.URLField()class Meta:ordering = ["-name"]def __str__(self):return self.nameclass Author(models.Model):salutation = models.CharField(max_length=10)name = models.CharField(max_length=200)email = models.EmailField()headshot = models.ImageField(upload_to='author_headshots')def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=100)authors = models.ManyToManyField('Author')publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)publication_date = models.DateField()視圖
# views.py from django.views.generic import ListView from books.models import Publisherclass PublisherList(ListView):model = PublisherURLS
# urls.py from django.urls import path from books.views import PublisherListurlpatterns = [path('publishers/', PublisherList.as_view()), ]這就是我們需要編寫的所有代碼。盡管我們仍然需要編寫一個模板。我們可以給視圖添加 template_name 屬性來告訴視圖使用哪個模板,但如果沒有明確的模板,Django 將從對象名稱中推斷一個。在這個例子中,推斷模板將是 "books/publisher_list.html" —— “books” 部分來自定義模型的 app 名稱,而 “publisher” 必須是模型名稱的小寫。
模板
{% extends "base.html" %}{% block content %}<h2>Publishers</h2><ul>{% for publisher in object_list %}<li>{{ publisher.name }}</li>{% endfor %}</ul> {% endblock %}三、根據不同環境分別配置settings
根據不同的場合(開發、測試、部署)配置不同的選項
四、對網站各個系統功能進行完整測試
編寫測試用例,生成測試覆蓋度報告
五、方法論:12factors
參考文檔
簡介
如今,軟件通常會作為一種服務來交付,它們被稱為網絡應用程序,或軟件即服務(SaaS)。12-Factor 為構建如下的 SaaS 應用提供了方法論:
- 使用標準化流程自動配置,從而使新的開發者花費最少的學習成本加入這個項目。
 - 和操作系統之間盡可能的劃清界限,在各個系統中提供最大的可移植性。
 - 適合部署在現代的云計算平臺,從而在服務器和系統管理方面節省資源。
 - 將開發環境和生產環境的差異降至最低,并使用持續交付實施敏捷開發。
 - 可以在工具、架構和開發流程不發生明顯變化的前提下實現擴展。 這套理論適用于任意語言和后端服務(數據庫、消息隊列、緩存等)開發的應用程序。
 
總結
以上是生活随笔為你收集整理的Django开发准则与最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 在ubuntu中使用cookiecutt
 - 下一篇: Django的主要开发流程(以扩充用户模