欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Django开发准则与最佳实践

发布时间:2024/4/11 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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开发准则与最佳实践的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。