【问题标题】:how to use user authentication in django如何在 django 中使用用户身份验证
【发布时间】:2015-11-26 09:02:43
【问题描述】:

我有一个 html 模板,我想用它在 django 中进行身份验证。我正在使用 pymongo 连接到远程 mongodb 和 fetch_data。远程 mongodb 有一个集合,其中包含演示用户的用户名和密码。我读到 django 有一个内置的身份验证模块,但我不想使用它。

我的模板:

<form action="/index.html">
    <div class="form-group">
        <div class="input-group">
            <div class="input-group-addon"><i class="fa fa-user"></i></div>
            <input type="text" class="form-control" placeholder="Username">
        </div>
    </div>
    <div class="form-group">
        <div class="input-group">
            <div class="input-group-addon"><i class="fa fa-asterisk"></i></div>
            <input type="password" class="form-control" placeholder="Password">
        </div>
    </div>
    <div class="row">
        <div class="col-xs-8 text-left checkbox">
            <label class="form-checkbox form-icon">
            <input type="checkbox"> Remember me
            </label>
        </div>
        <div class="col-xs-4">
            <div class="form-group text-right">
            <button class="btn btn-success text-uppercase" type="submit">Sign In</button>
            </div>
        </div>
    </div>
</form>

如何将模板中的数据传递到 views.py 文件?目前我没有使用任何身份验证。

我的意见.py:

from django.shortcuts import render
from django.http import HttpResponse

def login(request):
    return render(request, 'login/login.html')

在 Pymongo 中,我可以使用命令db.getCollection('users').find({'email':'%s'}) {{email}} 传递电子邮件并进行验证。

PS:我阅读的大多数教程都是关于 django 的内置身份验证的。

【问题讨论】:

    标签: python django mongodb authentication


    【解决方案1】:

    一般的方法是编写自定义身份验证后端来为您处理身份验证。然后建议创建在您的模板中呈现的自定义表单。

    身份验证后端

    class YourBackend(object):
        def authenticate(self, username=None, password=None):
            # Check the username/password and return a User.
    
        def get_user(self, user_id):
            # return user by given user_id
    

    设置

    当您实现了自己的身份验证后端时,您应该在 django settings.py 中定义它。第一个是django的默认认证后端。

    AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
        'your.own.authentication.backed',
    )
    

    表格

    from django import forms
    
    class YourLoginForm(forms.Form):
       username = forms.CharField(max_length=254)
       password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
    

    查看

    from django.shortcuts import render
    from django.http import HttpResponse
    from django.contrib.auth import authenticate, get_backends
    
    def login(request):
        form = YourLoginForm(request.POST or None)
    
        if form.method == 'POST':
           if form.is_valid():
               user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'])
    
               if user:
                   # redirect user to somewhere
    
        return render(request, 'login/login.html')
    

    模板

    <form action="{% url 'your-login' %}" method="POST">
        {{ form.non_field_errors }}
        <div class="form-group">
            <div class="input-group">
                {{ form.username.errors }}
                <div class="input-group-addon"><i class="fa fa-user"></i></div>
                {{ form.username }}
            </div>
        </div>
        <div class="form-group">
            <div class="input-group">
                {{ form.username.errors }}
                <div class="input-group-addon"><i class="fa fa-asterisk"></i></div>
                {{ form.password }}
            </div>
        </div>
        <div class="row">
            <div class="col-xs-4">
                <div class="form-group text-right">
                <button class="btn btn-success text-uppercase" type="submit">Sign In</button>
                </div>
            </div>
        </div>
    </form>
    

    网址

    url(r'^login$', 'views.login', name='your-login'),
    

    【讨论】:

      【解决方案2】:

      我建议您使用外部库进行身份验证和分析。我记得他们有 mongodb 的选项。但是如果你想重新发明轮子,那么你应该使用以下。

      1) 创建扩展 form.ModelForm 的类来处理注册和认证过程。你可以read documentation 怎么做。如果将帮助您处理数据的验证。您将能够验证唯一的电子邮件字段和其他内容。

      2) 创建 HTML 表单。您可以使用现有的并将其与您的 ModelClass 连接。

      3) 如果您使用的是表单,您可以在您的控制器中使用以下命令获取数据:

      form = MyForm(request.POST or None)
      

      然后您就可以将数据传递给此表单。如果您不想使用和形成类,那么您可以在控制器中以这种方式检索:

      if request.method == 'POST':
          login = request.POST.get('login', None)
          password = request.POST.get('password', None)
      

      用您可以使用 urls.py 的表单分配控制器,方法相同:

      url(r'^login$', 'views.login', name='login'),
      

      因此,使用表单类,您将能够在 GET 请求到达时传递空表单,如果是 POST 请求,那么您可以收集数据。此外,在您的 HTML 表单中添加以下内容:

      <form action="/login" method="post">
      

      4) 当您从登录表单收到数据时,您应该进行身份验证。这可以使用自定义身份验证后端来完成。你可以find info here 或者只是谷歌如何做到这一点。我以前从来没有做过,但是很简单。

      【讨论】:

      • 您能否详细说明第二种没有表单的方法,因为它是我的第一个 django 应用程序。
      • @ManishGupta,这是一个复杂的主题,但它在文档中很好地包含了示例:forms from modelsvalidation of the form。您将从这篇文档文章中了解表单类的工作原理。
      猜你喜欢
      • 1970-01-01
      • 2014-05-04
      • 2010-12-23
      • 2012-08-18
      • 1970-01-01
      • 2013-05-03
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多