使用Python Django开发web应用9/10/11 用户管理

版本声明:转载请注明出处。未经允许,禁止商业用途。

9/10/11 使用Python Django开发web应用 用户管理 讲师:刘一凡

认证系统
第一步:
配置
确认settings.py中:
INSTALLED_APPS中有
'django.contrib.auth',

第二步:
定义urlpattern,
在blog/urls.py的urlpatterns中添加
    path('regist/',views.regist),
    path('login/',views.my_login),
    path('logout/',views.my_logout),

第三步:定义Form
views.py中添加

class LoginForm(forms.Form):
    #前台会自动限制,输入到了50个字符就输不进去了
    username = forms.CharField(label='用户名',max_length=50)
    #设置为密码输入字段widget,前台会将输入显示为圆点,点击小眼睛,可以显示真实输入
    password = forms.CharField(label='密码',widget=forms.PasswordInput())

#RegistForm也需要username和password
#继承比去修改LoginForm类要方便
class RegistForm(LoginForm):
    #前台会自动做邮箱格式检查,格式不正确时输入框会变红,而且提示“你必须输入有效电子邮件地址”
    email = forms.EmailField(label='邮箱')

第四步:定义view函数
内置模型:
from django.contrib.auth.models import User

veiw支持:
注册:
from django.http.response import HttpResponse
import django.db
def regist(request):
    if request.method == 'POST':
        #使用request中的POST,实例化RegistForm得到userform
        userform = RegistForm(request.POST)
        #如果输入的内容合乎要求,则将输入的内容放在cleaned_data属性里
        if userform.is_valid():
            username = userform.cleaned_data['username']
            password = userform.cleaned_data['password']
            email = userform.cleaned_data['email']
            try:
                user = User.objects.create_user(username, email, password)
                #如果用户名已经存在,则抛出异常
                #UNIQUE constraint failed: auth_user.username
            except django.db.IntegrityError:
                return HttpResponse('注册失败!!!该用户名已经存在')

        #注册成功后跳转到登录页面
        return HttpResponseRedirect('/blog/login/')
    else:
        #method是GET,说明是获取注册页面,而不是提交注册信息,我们创建一个空的form
        userform = RegistForm()
        return render(request,'regist.html',{'userform':userform})

from django.contrib.auth import authenticate,login,logout
def my_login(request):
    if request.method == 'POST':
        userform = LoginForm(request.POST)
        if userform.is_valid():
            username = userform.cleaned_data['username']
            password = userform.cleaned_data['password']
            #认证成功则返回用户名,认证失败则返回None
            user = authenticate(username=username, password=password)
            if user:
                #登录
                #login()saves the user's ID in the session
                login(request, user)
                #跳转到主页
                return HttpResponseRedirect('/blog/')
            else:
                return HttpResponse('用户名或密码错误,请重新登录')
    #method是GET,说明是获取登录页面,而不是提交登录信息
    else:
        userform = LoginForm()
        return render(request,'login.html',{'userform':userform})

#注销
def my_logout(request):
    logout(request)
    return HttpResponseRedirect('/blog/')

第五步:
定义模板,templates文件夹下建立新文件,内容如下
login.html
<!DOCTYPE html>
<html lang="zh-CN"><head>  </head>
<body>
<h1>Login page</h1>
<form method = 'post' enctype="multipart/form-data">
{% csrf_token %}
{{userform.as_p}}
<input type="submit" value = "Login" />
</form>
</body>
</html>

regist.html
<!DOCTYPE html>
<html lang="zh-CN"><head>  </head>
<body>
<h1>Register page</h1>
<form method = 'post' enctype="multipart/form-data">
{% csrf_token %}
{{userform.as_p}}
<input type="submit" value = "Regist" />
</form>
</body>
</html>

blog.html中添加相关逻辑和内容
    {% if username %}
        <p>{{ username }}</p>
        <a href="/blog/logout">logout</a>
    {% else %}
        <a href="/blog/login">login</a>
        <a href="/blog/regist">regist</a>
    {% endif %}


第六步:
views.py的blog()中,需要把当前已经登录的username传递给blog.html
添加代码,向context里面添加username
    if request.user.is_authenticated:
        context['username']=request.user

return render(request,'blog.html',context)

第七步:
演示注册,前台登录和注销功能,注册后在后台查看和管理。

第八步:
但是截至目前,blog里面没有携带用户名。所以需要对model Blog进行扩展。
添加属性username。允许username为空,是因为之前提交的blog都没有携带username
    username = models.CharField(max_length=50,null=True)
进行makemigrations,然后migrate

另外要将username从BlogForm中剔除掉
修改为exclude={'timestamp','username',}

blog()不用修改,因为form是从model Blog生成的。但是
add()里面需要添加
blog.username=request.user

blog.html需要添加内容,用以显示blog的username
<p>{{ blog.username }}</p>

第九步:
演示登录后发表文章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值