日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django开发准则与最佳实践

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django开发准则与最佳实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在網易云課堂學習一門django高級實戰教程,本文是學習課時14、15的一些筆記

Django開發準則與最佳實踐

一、優先使用自定義用戶模型

繼承BaseUserManager和AbstractBaseUser,指定AUTH_USER_MODEL配置項

看一下cookiecutter給我們生成的項目結構下的mydjango/users/models.py
自定義的User繼承了AbstractUser

class User(AbstractUser):# First Name and Last Name do not cover name patterns# around the globe.name = CharField(_("Name of User"), blank=True, max_length=255)def get_absolute_url(self):return reverse("users:detail", kwargs={"username": self.username})

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)

class User(AbstractUser):"""Users within the Django authentication system are represented by thismodel.Username and password are required. Other fields are optional."""class Meta(AbstractUser.Meta):swappable = 'AUTH_USER_MODEL'

二、使用通用類視圖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 = Publisher

URLS

# 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开发准则与最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。