美文网首页Python学习日志python进阶程序员
【day 15】python编程:从入门到实践学习笔记-基于Dj

【day 15】python编程:从入门到实践学习笔记-基于Dj

作者: 苍云横渡 | 来源:发表于2018-03-27 11:45 被阅读147次

    学习笔记目录
    【day 1】python编程:从入门到实践学习笔记-安装、变量和简单数据类型
    【day 2】python编程:从入门到实践学习笔记-列表以及其操作
    【day 3】python编程:从入门到实践学习笔记-if 语句(末附练习答案代码)
    【day 4】python编程:从入门到实践学习笔记-字典(末附练习答案代码)
    【day 5】python编程:从入门到实践学习笔记-用户输入和while循环(末附答案代码)
    【day 6】python编程:从入门到实践学习笔记-函数(末附练习答案代码)
    【day 7】python编程:从入门到实践学习笔记-类(末附练习答案代码)
    【day 8】python编程:从入门到实践学习笔记-文件和异常(末附练习答案代码)
    【day 9】python编程:从入门到实践学习笔记-测试代码(末附练习答案代码)
    【day 10】python编程:从入门到实践学习笔记-Django入门(一)
    【day 11】python编程:从入门到实践学习笔记-Django入门(二)
    【day 12】python编程:从入门到实践学习笔记-Django入门(三)
    【day 13】python编程:从入门到实践学习笔记-Django入门(四)
    【day 14】python编程:从入门到实践学习笔记-用户账户(一)
    【day 15】python编程:从入门到实践学习笔记-用户账户(二)
    【day 16】python编程:从入门到实践学习笔记-用户账户(三)
    【day 17】python编程:从入门到实践学习笔记-设计样式和部署(一)
    【day 18】python编程:从入门到实践学习笔记-设计样式和部署(二)& 补充

    第十九章 用户账户(二)

    创建用户账户

    这一部分我们来创建用户注册和身份验证系统。

    应用程序users

    首先使用命令python manage.py startapp users创建名为users的应用程序,现在你的目录应该和下面一样。

    1.将应用程序users添加到settings.py

    #--snip--
    INSTALLED_APPS = (
        #--snip--
        'learning_logs',
        'users',
    )
    #--snip--
    

    2.创建users的URL模式

    from django.conf.urls import url, include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^users/', include('users.urls', namespace='users')),
        url(r'', include('learning_logs.urls', namespace='learning_logs')),
    ]
    

    添加的代码与任何以单词users大头的URL(如http://localhost:8000/users/login/)都匹配。

    登录页面

    在learning_log/users/中新建一个urls.py。

    from django.conf.urls import url
    from django.contrib.auth.views import login
    
    from . import views
    
    urlpatterns = [
        url(r'^login/$', login, {'template_name': 'users/login.html'},name='login'),
    ]
    

    首先导入默认视图login,接着登录页面的URL模式与URLhttp://localhost:8000/ users/login/匹配。实参login(不是views.login)告诉django将请求发送给视图login。接着传递了一个字典指定要查找的模板。
    1.模板login.html
    同样,新建一个路径users/templates/users/,接着在这个路径下新建login.html。

    {% extends "learning_logs/base.html" %}
    
    {% block content %}
    
      {% if form.errors %}
      <p>Your username and password didn't match. Please try again.</p>
      {% endif %}
    
      <form method="post" action="{% url 'users:login' %}">
      {% csrf_token %}
      {{ form.as_p }}
      
      <button name="submit">log in</button>
      <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
      </form>
      
    {% endblock content %}
    

    这个模板同样继承了base.html。一个应用程序中的模板可继承另一个应用程序中的模板。
    表单errors属性可以在输入的用户名-密码错误时显示错误消息。
    将实参action设置为登录页面的URL,让登录视图处理表单。表单元素next告诉django在用户成功登录后将其重定向到主页。
    2.链接到登录页面
    在base.html中添加到登录页面的链接,但当用户已登录时,为了不显示这个链接,我们把它嵌套在{% if %}标签中。

    <p>
      <a href="{% url 'learning_logs:index' %}">Learning Log</a> - 
      <a href="{% url 'learning_logs:topics' %}">Topics</a> - 
      {% if user.is_authenticated %}
        Hello, {{ user.username }}.
      {% else %}
        <a href="{% url 'users:login' %}">log in</a>
      {% endif %}
    </p>
    
    {% block content %}{% endblock content %}
    

    在django身份验证系统中,每个模板都可以使用变量user,变量的is_authenricated属性:如果用户已登录,该属性值为True,否则为Faule;变量的username属性为用户名。
    3.使用登录页面
    如果你之前登录过管理员,记得先在http://127.0.0.1:8000/admin注销登录。然后重新登录我们的学习笔记网页登录页面http://127.0.0.1:8000/users/login/,并使用管理员的帐号密码登录。

    注销

    1.注销URL

    #users/urls.py
    from django.conf.urls import url
    from django.contrib.auth.views import login
    
    from . import views
    
    urlpatterns = [
        url(r'^login/$', login, {'template_name': 'users/login.html'},name='login'),
        url(r'^logout/$', views.logout_view, name='logout'),
    ]
    

    2.视图函数logout_view()
    django自带函数模块logout(),我们只需导入他,并调用他重定向到主页。

    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse
    from django.contrib.auth import logout
    
    def logout_view(request):
        logout(request)
        return HttpResponseRedirect(reverse('learning_logs:index'))
    

    在这里,request对象作为实参传递给函数logout()
    3.链接到注销视图
    在base.html中添加注销链接。为了使得仅当用户登录后才能看见他,我们将他放在标签{% if user.is_authenticated %}中。

    #base.html
    <p>
      <a href="{% url 'learning_logs:index' %}">Learning Log</a> - 
      <a href="{% url 'learning_logs:topics' %}">Topics</a> - 
      {% if user.is_authenticated %}
        Hello, {{ user.username }}.
        <a href="{% url 'users:logout' %}">log out</a>
      {% else %}
        <a href="{% url 'users:login' %}">log in</a>
      {% endif %}
    </p>
    
    {% block content %}{% endblock content %}
    

    运行服务器可以看到

    注册页面

    1.注册页面的URL模式

    from django.conf.urls import url
    from django.contrib.auth.views import login
    
    from . import views
    
    urlpatterns = [
        url(r'^login/$', login, {'template_name': 'users/login.html'},name='login'),
        url(r'^logout/$', views.logout_view, name='logout'),
        url(r'^register/$', views.register, name='register'),
    ]
    

    2.视图函数reigster()
    当注册页面首次被请求时,视图函数register()显示一个空的注册表单,用户提交后注册成功并自动登录。

    from django.shortcuts import render
    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse
    from django.contrib.auth import login, logout, authenticate
    from django.contrib.auth.forms import UserCreationForm
    
    def logout_view(request):
    --snip--
    
    def register(request):
        if request.method != 'POST':
            #显示空的注册表单
            form = UserCreationForm();
        else:
            #处理填写好的表单
            form = UserCreationForm(data=request.POST)
            
            if form.is_valid():
                new_user = form.save()
                #让用户自动登录并重定向到主页
                authenticate_user = authenticate(username=new_user.username,
                    password=request.POST['password1'])
                login(request, authenticate_user)
                return HttpResponseRedirect(reverse('learning_logs:index'))
                
        context = {'form': form}
        return render(request, 'users/register.html', context)
    

    函数login()和函数 authenticate()可以让用户注册成功后自动登录。
    在注册的时候,如果用户提交的注册表单数据有效,调用方法save()并返回新创建的用户对象,保存在new_user中。
    自动登录过程中,调用authenticate()并把实参new_user.username和密码(因为表单有效,两个密码相同,所以我们使用第一个密码'password1')传给它。接着我们将authenticate()返回的通过身份验证的用户对象保存在authenticate_user中。最后调用函数login(),并把对象request和authenticate_user传给他。最后完成自动登录。
    3.注册模板
    创建一个register.html,和login.html放在一起。

    {% extends "learning_logs/base.html" %}
    
    {% block content %}
    
      <form method="post" action="{% url 'users:register' %}">
        {% csrf_token %}
        {{ form.as_p }}
        
        <button name="submit">register</button>
        <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
      </form>
      
    {% endblock content %}
    

    4.链接到注册页面

    <p>
      <a href="{% url 'learning_logs:index' %}">Learning Log</a> - 
      <a href="{% url 'learning_logs:topics' %}">Topics</a> - 
      {% if user.is_authenticated %}
        Hello, {{ user.username }}.
        <a href="{% url 'users:logout' %}">log out</a>
      {% else %}
        <a href="{% url 'users:register' %}">register</a> - 
        <a href="{% url 'users:login' %}">log in</a>
      {% endif %}
    </p>
    
    {% block content %}{% endblock content %}
    

    运行服务器可以看到

    相关文章

      网友评论

        本文标题:【day 15】python编程:从入门到实践学习笔记-基于Dj

        本文链接:https://www.haomeiwen.com/subject/pzarcftx.html