我创建了一个可能会让Django变得稍微方便一点的库的故事

我计划写一篇文章,介绍在平成最后的四月(2019年4月27日),我发布了一个或许能让Django变得更加方便的库,并且最近已经突破了1万次下载。

Django-增强版

GitHub
https://github.com/ChanTsune/django-boost

GitHub
https://github.com/ChanTsune/django-boost

你为什么要做这个呢?

我在INIAD的课堂上学习了基于Python的Web应用框架Django,这让我产生了让Django更加方便使用的想法。

你能做什么呢?

在Django开发过程中,您可以轻松地完成一些您想要做的事情。

    • メールアドレスでログインするユーザーを簡単に使える

 

    • Djangoテンプテートのなかで、Pythonの組み込み関数が使える

 

    • URLの定義を見やすく書ける

 

    • Http404以外の例外を投げることができる

 

    • 一定時間ごとに再認証を要求するページが作れる

 

    • Formクラスの中でログインしているユーザーの情報に触れる

 

    herokuにアプリケーションをデプロイするのがちょっとだけ簡単になる

除此之外,还有很多琐碎的功能,但由于太过细微和低调,本次将省略介绍。
请查看文档以获取详细信息。

引入

$ pip install django_boost

我会使用pip进行安装。

设定

在Django项目中,添加配置以启用django_boost。



INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_boost', # 追記
]

每个功能的介绍

通过电子邮件地址登录的用户

在设置文件中添加以下内容。

AUTH_USER_MODEL = 'django_boost.EmailUser'

将Django标准用户模型中的用户名替换为使用电子邮件登录的用户。替换后的用户模型与Django标准用户模型具有相同的字段。

在Django模板中,使用Python内置函数。

将以下描述添加到模板文件中,可以使得Django模板中的Python内置函数能够作为过滤器和标签使用。

{% load boost %}

Python内置函数列表
https://docs.python.org/ja/3/library/functions.html

就我个人而言,在字符串格式化的时候,我经常使用format函数。

{% load boost %}

{{ value|format:"," }} {# 数字を3桁毎にカンマ区切りで表示 #}

zip这些工具还是挺方便的。
另外,在开发过程中,可以在模板中查看变量类型和属性列表,像type和dir之类的函数也很方便。

尽管不是内置函数,但还是可以从字符串字面值创建对象的标签。

在下面的例子中,我们正在创建一个列表。

{%load boost %}

{% literal "[1,2,3]" as lst %}

{% for i in lst %}
  <p>{{ i }}</p>
{% endfor %}

将URL的定义以易于阅读的方式写出来

我认为,当在一个应用程序中创建多个模型时,urlpatterns会变得越来越难以阅读。但是,您可以在繁琐的文件拆分时利用它。

from django_boost.urls import UrlSet

class YourModelUrlSet(UrlSet):
    app_name = "YourModel"
    urlpatterns = [
        path('xxx/', ..., name="XXX")
        path('yyy/', ..., name="YYY")
        path('zzz/', ..., name="ZZZ")
    ]

urlpatterns = [
    path('path/to/model/', include(YourModelUrlSet))
]

将每个模型的CRUD视图分开,可以提高可读性。
我认为,根据模型进行命名空间的划分也是非常方便的。

抛出Http404之外的异常

我认为在没有满足权限条件时返回404是很常见的做法。也可以抛出其他异常。

需要在设置文件中稍微添加一些内容才能利用。

MIDDLEWARE = [
    'django_boost.middleware.HttpStatusCodeExceptionMiddleware',  # 追記
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

我添加了一个中间件。

在这种情况下,在视图处理中抛出异常将返回该状态码。
下面的示例中,我们抛出Http302异常进行重定向。

from django.shortcuts import render
from django_boost.http.response import Http302

def my_view(request):
  if request.user.email == "":
     raise Http302("/register/email/")
  return render(request, "mypage.html")

除了302之外,还覆盖了大部分的状态码。

如果想要使用自定义模板,只需将[状态码].html文件放置在templates目录直接下面,系统将会使用该模板。

每隔一段时间就要求重新认证的页面。

如果您使用基于类的方式创建View的话,可以通过继承混合类来创建需要定期进行身份验证的页面。

from datetime import timedelta
from django_boost.views.mixins import ReAuthenticationRequiredMixin

class MyView(ReAuthenticationRequiredMixin,TemplateView):
    template_name = '...'
    auth_unnecessary = timedelta(hours=1)

通过设置类变量auth_unnecessary,当距离最后登录时间超过设定的间隔时,会要求重新认证。

可以在auth_unnecessary中使用整数来指定秒数,也可以使用timedelta进行指定。

在Form类中访问登录用户的信息

我想,当进行表单验证时,经常有想要根据用户更改验证条件的情况。

当出现这种情况时,通过在Form类和View类中分别继承以下的Mixin类,可以实现在form类内部通过self.user来访问用户信息。

from django import forms
from django_boost.forms.mixins import FormUserKwargsMixin

class MyForm(FormUserKwargsMixin,Form):
   email = forms.EmailField()

   def email_clean(self):
      if self.user.email: # ログインしているユーザーのメールアドレス
          ...
      ...
form django_boost.views.mixins import ViewUserKwargsMixin
from .forms import MyForm

class MyView(ViewUserKwargsMixin,FormView):
   form_class = MyForm
   ...

将应用程序部署到Heroku变得稍微简单一些。

可以使用命令来自动生成在部署Django应用程序到Heroku时所需的配置文件。

$ python manage.py support_heroku
Generated : /Users/username/project/Procfile
Generated : /Users/username/project/runtime.txt
Generated : /Users/username/project/requirements.txt

自动生成Procfile、runtime.txt和requirements.txt文件。

如果存在同名的文件,则不会生成,如果想要覆盖并生成,请加上”–overwrite”选项。

$ python manage.py support_heroku --overwrite

最后

我之前在开头就提到过,除了这些之外还有很多细小而朴实的功能,所以如果对此感兴趣的话,请查阅相关文件。

当开发者得到星星时,他们会感到高兴!
https://github.com/ChanTsune/django-boost

bannerAds