我创建了一个可能会让Django变得稍微方便一点的库的故事
我计划写一篇文章,介绍在平成最后的四月(2019年4月27日),我发布了一个或许能让Django变得更加方便的库,并且最近已经突破了1万次下载。
Django-增强版
GitHub
https://github.com/ChanTsune/django-boostGitHub
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