我正在尝试使用this library为我的项目添加双因素身份验证。我注意到模块有自己的登录视图,你可以找到正确的here,请参阅class LoginView(IdempotentSessionWizardView):
。
我遇到的问题是我已经拥有自己的登录视图来处理身份验证表单,为什么我会使用模块的视图?我只需要将2FA部分添加到我自己的视图中,而不是使用另一个部分,但遗憾的是该模块在这一部分并不是很清楚。
所以问题是:我如何将他们的登录视图集成到我自己的登录视图中?如何在不使用其他登录处理程序的情况下将2fa部分添加到我自己的部分?
欢迎任何建议,这是我已经存在的登录视图:
def login_request(request):
if request.method == "POST":
if result['success']:
form = AuthenticationForm(request, data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
messages.info(request, f"You are now logged in as {username}")
return redirect("main:homepage")
else:
messages.error(request, "Invalid username or password")
else:
messages.error(request, "Invalid username or password")
编辑:我被建议使用自己的登录视图。是的,这会更容易。但是在将来我想在登录中添加更多内容,例如验证码表格或其他字段。但那是不可能的,因为我不会使用我自己的视图而是模块的视图。是对的吗?
从这里的评论转换讨论:
一般来说,你想在使用Django提供的电池提供的视图之前自己动手,甚至在从头开始编辑自己的视图之前,你想要继承并扩展Django视图,例如LoginView。
同样的原则适用于(架构良好的)外部库,如链接的django-two-factor-auth
。
首先,您只需使用其中包含的视图,可能直接使用include()
ing urls
module。
然后,如果您确实需要在这些视图中自定义某些内容,则您将从该视图继承,例如
from two_factor.views import LoginView
class MyLoginView(LoginView):
template_name = 'super_fancy_login_template.html'
form_list = (
('auth', MyAwesomeAuthenticationForm),
# ... the rest from the original here ...
)
并在同一条路径上的库提供的视图之前将它挂在urls
中:
from django.conf.urls import url
from my_awesome_app.views import MyLoginView
urlpatterns = [
url(
regex=r'^account/login/$',
view=MyLoginView.as_view(),
name='login',
),
include(...),
]
嘿presto,你用自己的视图替换了一个视图。
显然,你更换这样的部件越多,你就越少有“保修”(不是说开源软件都带有保修;))事情仍然可以正常工作。