免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6222 | 回复: 2
打印 上一主题 下一主题

Django使用用户系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-12 15:01 |只看该作者 |倒序浏览
Django使用用户系统




最近在用django做一个小网站,在做用户登录的这个模块,一开始想自己实现的,后面发现真的很复杂。

就拿了django自带的用户系统来使用了。在这中间出了很多的问题,现在记录下

网站的基础模板包含一个导航条,和大部分网站一样,就是没有登录显示登录。登录后就显示用户名

在前端页面使用了的话,可以拿user对象来使用



Python代码
  1. <div class="userinfo">
  2.                                 {% if user.is_authenticated %}
  3.                                         欢迎您:{{user.username}}
  4.                                 {% else %}
  5.                                         <a href="/account/login">登录</a>
  6.                                         <a href="/account/register">注册</a>
  7.                                 {% endif %}
  8.                                 <a href="/account/logout">注销</a>
  9.                         </div>
复制代码
要在页面引入这个user对象的话,就必须在django的settings里面加入一下的代码:



Python代码
  1. TEMPLATE_CONTEXT_PROCESSORS = (
  2.     "django.contrib.auth.context_processors.auth",
  3.     "django.core.context_processors.debug",
  4.     "django.core.context_processors.i18n",
  5.     "django.core.context_processors.media",
  6.     "django.core.context_processors.request",
  7. )
复制代码
其中 django.contrib.auth.context_processors.auth就包含user对象



其实就是一些上下文处理器,这些处理器都返回一个字典。例如。我们看auth的代码。



Python代码
  1. def auth(request):
  2.     def get_user():
  3.         if hasattr(request, 'user'):
  4.             return request.user
  5.         else:
  6.             from django.contrib.auth.models import AnonymousUser
  7.             return AnonymousUser()

  8.     return {
  9.         'user': SimpleLazyObject(get_user),
  10.         'messages': messages.get_messages(request),
  11.         'perms':  lazy(lambda: PermWrapper(get_user()), PermWrapper)(),
  12.     }
复制代码
可以看到user对象就是这样被返回回来供我们使用的,取得user对象是调用一个方法从request里面取。如果没有取到的话就是匿名用户了。这样在页面的验证就会被判断会匿名



一个登录和登出的代码



Python代码
  1. # -*- coding:utf-8 -*-
  2. # Create your views here.
  3. from django.shortcuts import render_to_response,render,get_object_or_404
  4. from CodeShare.account.forms import UserRegisterForm
  5. from django.http import HttpResponse, HttpResponseRedirect
  6. from django.contrib.auth.models import User
  7. from django.contrib.auth import authenticate, login as user_login, logout as user_logout


  8. def index(request):
  9.     #用户的个人页面
  10.     return render(request,'account/index.html')


  11. def register(request):
  12.     #注册提交
  13.     if request.method == 'POST':
  14.         form = UserRegisterForm(data=request.POST)
  15.         if form.is_valid():
  16.             new_user = User.objects.create_user(request.POST['username'], request.POST['email'], request.POST['password'])
  17.             new_user.save()
  18.             return render(request,'account/index.html')
  19.         else:
  20.             return render(request,'account/register.html', {'form':form})
  21.     #超链接点击过来的注册
  22.     else:
  23.         return render(request,'account/register.html')
  24. #        return render_to_response('user/register.html', context_instance=RequestContext(request))
  25.    
  26. def login(request):
  27.     #表单提交过来的数据
  28.     if request.user.is_authenticated():
  29.         return  HttpResponse('你已经登录')
  30.     if request.method == 'POST':
  31.         username = request.POST['username']
  32.         password = request.POST['password']
  33.         user = authenticate(username=username, password=password)
  34.         if user is not None:
  35.             if user.is_active:
  36.                         user_login(request, user)
  37.                         return HttpResponseRedirect('/account/%d' % user.id)
  38.             else:
  39.                     return HttpResponse('用户没有启用!')
  40.         else:
  41.                 return HttpResponse('用户名或者密码错误!')
  42.     else:
  43.         return render_to_response('account/login.html')
  44.    
  45. def logout(request):
  46.     user_logout(request)
  47.     return render_to_response('index.html')
复制代码
这里的登录和登出都是使用自带的方法,只是import进来避免同名取了个别名

当用户验证通过后

使用user_login(request, user) 就会把用户存到session里面。

而删除也就是从session中销毁


这里有一个很重要的问题

如果要在页面使用user,那么页面必须要有request对象(为什么?因为user就是从request里面取的)

所以在渲染页面的时候。如果要使用这个验证,就必须要把request对象也渲染进去

我之前渲染页面就是用return render_to_response('index.html')

这样的话,只是单纯渲染页面。是不会把request传进去的。必须显式的指定

加入context_instanse=RequestContext(request)才有办法在页面使用


但是每次render都这样写是不是很烦?



django1.3新增了一个shortcut


render


其实就是一默认使用RequestContext的render_to_response


这个方法除了有一个必须的第一个参数 request

外,和render_to_response都一样



使用传统的页面重定向,是默认会带入request的,如使用HttpResponseRedirect


ps:记一个pydev的问题

在pydev里面写django代码。如果想引入django的settings文件

要设置好django项目的2个变量。不然会import出错 提示找不到



(其实默认是设置好的)


右键项目 找到PYTHON-PYTHONPATH

在里面的String subsitution Variables里面

必须有2个变量


DJANGO_MENAGE_LOCATION 你项目的manage,py的地址



DJANGO_SETTINGS_MODULE  settings文件的路径(注意这里的路径是python的路径。也就是包名形式的,如果是路径形式的话会出错)

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
2 [报告]
发表于 2011-05-13 12:41 |只看该作者
登录后用户都存到session里面了,还要再用request ?

论坛徽章:
0
3 [报告]
发表于 2011-07-22 15:48 |只看该作者
回复 1# 中关村村草


    研究中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP