添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
细心的鼠标垫  ·  Pyspark.sql DataFrame ...·  2 年前    · 

适用范围: yes Visual Studio no Visual Studio for Mac no Visual Studio Code

上一步: 使用完整的 Django Web 项目模板

身份验证是 Web 应用的常见需求,因此“Django Web 项目”模板包含基本的身份验证流。 在使用任意 Django 项目模板时,Visual Studio 包含 Django 项目的 settings.py 文件中身份验证所需的所有模块。

在此步骤中,你将了解:

  • 如何使用 Visual Studio 模板中提供的身份验证流(步骤 5-1)
  • 步骤 5-1:使用身份验证流

    以下步骤执行身份验证流,并介绍项目的各个部分:

  • 如果尚未遵循项目根目录 readme.html 文件中的说明来创建超级用户(管理员)帐户,请现在执行此操作 。

  • 使用“调试”>“启动调试”(F5),从 Visual Studio 运行应用 。 当应用出现在浏览器中时,观察“登录” 是否显示在导航栏右上方。

  • 打开 templates/app/layout.html,并观察 <div class="navbar ...> 元素是否包含标记 {% include app/loginpartial.html %} {% include %} 标记指示 Django 的模板化系统在包含模板中此时所含的文件内容中进行拉取。

  • 打开 templates/app/loginpartial.html 并观察它如何使用条件标记 {% if user.is_authenticated %} {% else %} 标记来呈现不同的 UI 元素,具体取决于是否已对用户进行身份验证:

    {% if user.is_authenticated %}
    <form id="logoutForm" action="/logout" method="post" class="navbar-right">
        {% csrf_token %}
        <ul class="nav navbar-nav navbar-right">
            <li><span class="navbar-brand">Hello {{ user.username }}!</span></li>
            <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
    </form>
    {% else %}
    <ul class="nav navbar-nav navbar-right">
        <li><a href="{% url 'login' %}">Log in</a></li>
    {% endif %}
    
  • 由于首次启动应用时未对任何用户进行身份验证,因此该模板代码仅呈现指向相对“login”路径的“登录”链接。 如 urls.py 中所指定(如前一部分所示),该路由被映射到 django.contrib.auth.views.login 视图,并且该视图接收以下数据:

    'template_name': 'app/login.html', 'authentication_form': app.forms.BootstrapAuthenticationForm, 'extra_context': 'title': 'Log in', 'year': datetime.now().year,

    在这里,template_name 标识登录页的模板,在本例中为 templates/app/login.html 。 extra_context 属性被添加到提供给模板的默认上下文数据中。 最后,authentication_form 指定用于登录的窗体类,它在模板中显示为 form 对象。 默认值为 AuthenticationForm(来自 django.contrib.auth.views);Visual Studio 项目模板改为使用应用 forms.py 文件中定义的窗体 :

    from django import forms
    from django.contrib.auth.forms import AuthenticationForm
    from django.utils.translation import ugettext_lazy as _
    class BootstrapAuthenticationForm(AuthenticationForm):
        """Authentication form which uses boostrap CSS."""
        username = forms.CharField(max_length=254,
                                   widget=forms.TextInput({
                                       'class': 'form-control',
                                       'placeholder': 'User name'}))
        password = forms.CharField(label=_("Password"),
                                   widget=forms.PasswordInput({
                                       'class': 'form-control',
                                       'placeholder':'Password'}))
    

    如你所见,此窗体类派生自 AuthenticationForm 且专门替代用户名和密码字段来添加占位符文本。 Visual Studio 模板包括此显式代码,前提是你可能需要自定义窗体,比如添加密码强度验证。

  • 导航到登录页时,应用随即会显示 login.html 模板 。 变量 {{ form.username }}{{ form.password }} 呈现来自 BootstrapAuthenticationFormCharField 窗体。 还有一个内置部分用于显示验证错误,如果选择添加这些服务,会有一个用于社交登录的现成元素。

    {% extends "app/layout.html" %}
    {% block content %}
    <h2>{{ title }}</h2>
    <div class="row">
        <div class="col-md-8">
            <section id="loginForm">
                <form action="." method="post" class="form-horizontal">
                    {% csrf_token %}
                    <h4>Use a local account to log in.</h4>
                    <div class="form-group">
                        <label for="id_username" class="col-md-2 control-label">User name</label>
                        <div class="col-md-10">
                            {{ form.username }}
                    <div class="form-group">
                        <label for="id_password" class="col-md-2 control-label">Password</label>
                        <div class="col-md-10">
                            {{ form.password }}
                    <div class="form-group">
                        <div class="col-md-offset-2 col-md-10">
                            <input type="hidden" name="next" value="/" />
                            <input type="submit" value="Log in" class="btn btn-default" />
                    {% if form.errors %}
                    <p class="validation-summary-errors">Please enter a correct user name and password.</p>
                    {% endif %}
                </form>
            </section>
        <div class="col-md-4">
            <section id="socialLoginForm"></section>
    {% endblock %}
    
  • 提交表单时,Django 会尝试对凭据(如超级用户凭据)进行身份验证。 如果身份验证失败,你将仍处于当前页面,但 form.errors 将设置为 true。 如果身份验证成功,Django 将导航到“下一步”字段中的相对 URL <input type="hidden" name="next" value="/" />,在本例中为主页 (/)。

  • 现在,当主页再次呈现,user.is_authenticated 属性会在 loginpartial.html 模板呈现时为“true” 。 因此,将看到“Hello (用户名)”消息和“注销” 。 可以在应用其他部分中使用 user.is_authenticated 来检查身份验证。

  • 需要从数据库中检索用户特定的权限,以检查经过身份验证的用户是否有权访问特定资源。 有关详细信息,请参阅使用 Django 身份验证系统(Django 文档)。

  • 特别需要指出的是,超级用户或管理员有权访问内置 Django 管理员接口,方法是使用相对 URL“/admin/”和“/admin/doc/”。若要启用这些接口,请按照以下步骤操作:

  • 将 docutils Python 包安装到环境中。 一个不错的安装方法是将“docutils”添加到 requirements.txt 文件。 然后,转到“解决方案资源管理器”,展开该项目,再展开“Python 环境”节点,然后右键单击正在使用的环境并选择“通过 requirements.txt 安装”。

  • 打开 Django 项目的 urls.py 文件,并添加以下内容:

    from django.conf.urls import include
    from django.contrib import admin
    admin.autodiscover()
    urlpatterns = [
        path('admin/doc/', include('django.contrib.admindocs.urls'))
    
  • 在 Django 项目的 settings.py 文件中,转到 INSTALLED_APPS 集合并添加 'django.contrib.admindocs'

  • 重启应用时,可以导航到“/admin/”和“/admin/doc/”并执行任务,如创建更多用户帐户。

  • 身份验证流的最后一部分是注销。 正如 loginpartial.html 中所示,“注销”链接只需对相对 URL“/login”执行 POST 操作,这由内置视图 django.contrib.auth.views.logout 处理 。 此视图不显示任何 UI,只需导航到主页(如“^logout$”模式 urls.py 中所示) 。 若要显示注销页,首先按照下面的方式更改 URL,添加“template_name”属性并删除“next_page”属性:

    path('logout/',
        django.contrib.auth.views.logout,
            'template_name': 'app/loggedoff.html',
            # 'next_page': '/',
        name='logout')
    

    然后通过以下(最小)内容创建 templates/app/loggedoff.html :

    {% extends "app/layout.html" %}
    {% block content %}
    <h3>You have been logged off</h3>
    {% endblock %}
    

    结果如下所示:

  • 完成所有操作后,停止服务器,并再次将所做的更改提交到源代码管理。

    问:<form> 元素中的 {% csrf_token %} 标记有何用途?

    答:{% csrf_token %} 标记包含 Django 的内置跨网站请求伪造 (csrf) 保护(Django 文档)。 通常将此标记添加到涉及 POST、PUT 或 DELETE 请求方法的任何元素(如窗体)。 然后,模板呈现函数 (render) 会插入必要的保护。

    如果已在本教程的整个课程中将 Visual Studio 解决方案提交到源代码管理,那么现在是执行另一个提交的好时机。 解决方案应匹配 GitHub 上的教程源代码:Microsoft/python-sample-vs-learning-django

    现在,你已了解 Visual Studio 中“空白 Django Web 项目”和“Django Web 项目”模板的全部内容。 你已了解包括使用视图和模板在内的所有 Django 基础知识。 你还了解了路由、身份验证和使用的数据库模型。 现在应能够使用任何所需的视图和模型来创建你自己的 Web 应用。

    在开发计算机上运行 Web 应用只是使应用可供客户使用的一个步骤。 后续步骤可能包括以下任务:

  • 通过创建一个名为 templates/404.html 的模板来自定义 404 页。 如果存在该模板,Django 会使用此模板而不是其默认模板。 有关详细信息,请参阅 Django 文档中的错误视图

  • 在 tests.py 中编写单元测试;Visual Studio 项目模板为这些测试提供起始点,若要了解更多信息,可以在 Django 文档的编写首个 Django 应用,第 5 部分 - 测试在 Django 中进行测试中找到

  • 将应用从 SQLite 更改为生产级数据存储,如 PostgreSQL、MySQL 和 SQL Server(它们都可以在 Azure 上托管)。 如何时使用 SQLite (sqlite.org) 中所述,SQLite 适用于低到中等规模的流量站点(一天点击量不足 100K)。 但是,不建议将 SQLite 用于更高的卷。 SQLite 还仅限于一台计算机,因此不能在任何多服务器场景中使用,例如负载均衡和异地复制。 有关 Django 对其他数据库的支持的信息,请参阅数据库设置。 另外,还可以使用 Azure SDK for Python,以便使用 Azure 存储服务,如表和 blob。

  • 在 Azure DevOps 等服务上设置持续集成/持续部署管道。 除了使用源代码管理(通过 Azure Repos、GitHub 或在其他位置)外,还可以将 Azure DevOps 项目配置为自动运行单元测试作为发布的先决条件。 还可以在部署到生产环境之前,将管道配置为部署到暂存服务器以进行更多测试。 此外,Azure DevOps 还与 App Insights 等监视解决方案集成,并使用敏捷规划工具闭合整个周期。 有关详细信息,请参阅在 Azure DevOps 项目中为 Python 创建 CI/CD 管道以及常规 Azure DevOps 文档

  • Django 中的用户身份验证 (docs.djangoproject.com)
  • GitHub 上的教程源代码:Microsoft/python-sample-vs-learning-django
  •