【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(一)】

这里我们要进行开发一个发布会系统来了解Django框架,来看第一部分。

目录:

  • 一、登录功能

  • 二、Cookie和Session

  • 三、Django认证系统

一、登录功能             返回目录 

在上一章,我们已经简单用了html模板,在它基础上继续开发:

1、修改index.html文件为发布会html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django Page</title>
</head>
<body>
    <h1>发布会系统</h1>
    <form>
        <input name="username" type="text" placeholder="输入用户名"/>
        <br/>
        <input name="password" type="password" placeholder="输入密码"/>
        <br/>
        <button id="btn" type="submit">登录</button>
        {% csrf_token %}
    </form>
</body>
</html>

2、GET、POST请求

(1)GET请求

form标签中加入:method="get"

    <form method="get">
        <input name="username" type="text" placeholder="输入用户名"/>
        <br/>
        <input name="password" type="password" placeholder="输入密码"/>
        <br/>
        <button id="btn" type="submit">登录</button>
    </form>

在页面输入用户名密码之后,提交表单,URL地址会添加用户名、密码

(2)POST请求

提交表单后,页面报错:

大概意思是Django对CSRF有保护措施,表单会自动生成令牌,通过令牌判断POST是否来自同一个网站,只需添加令牌即可,form添加{% csrf_token %}#}

    <form method="post">
        <input name="username" type="text" placeholder="输入用户名"/>
        <br/>
        <input name="password" type="password" placeholder="输入密码"/>
        <br/>
        <button id="btn" type="submit">登录</button>
         # 添加令牌
        {% csrf_token %}
    </form>

再次刷新提交,就不报错了。

3、处理登录请求

修改index.html,添加action="/login_action/":

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

再打开guest/urls.py文件,添加路径:

urlpatterns = [
    ...
    url(r‘^login_action/$‘, views.login_action)
]

再在sign/views.py下添加login_action()函数

def login_action(request):
    if request.method == "POST":
        username = request.POST.get("username","")
        password = request.POST.get("password","")
        if username == "123" and password == "1":
            return HttpResponse("Django good!")
        else:
            return render(request,"index.html",{"error" : "Django login is error!"})

最后再在templates/index.html中添加error错误提示:

    <form method="post" action="/login_action/">
        <input name="username" type="text" placeholder="输入用户名"/>
        <br/>
        <input name="password" type="password" placeholder="输入密码"/>
        <br/>
        <button id="btn" type="submit">登录</button>
        <br/>     # 提示信息
        {{ error }}
        {% csrf_token %}
    </form>

{ { error } }:对应render返回字典中的key。

如果用户名密码正确则:

否则的话,提示报错信息:

4、登陆成功页面

但是,不能只是通过文字展示登录成功信息,必须需要替换为登录成功页面。

添加templates/enent_manage.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Manage</title>
</head>
<body>
    <h1>Login success!</h1>
</body>
</html>

修改sign/views.py

def login_action(request):
    if request.method == "POST":     # "username"和"password"为name属性值,很重要
        username = request.POST.get("username","")
        password = request.POST.get("password","")
        if username == "123" and password == "1":
            # HttpResponseRedirect:这个类可以重定向指定页面
            return HttpResponseRedirect("/event_manage/")
        else:
            return render(request,"index.html",{"error" : "Django login is error!"})

# 登陆成功页面
def event_action(request):
    return render(request,"event_manage.html")

修改guest/urls.py:

urlpatterns = [
    ...
    url(r‘^event_manage/$‘, views.event_action),
]

再进行登录:

二、Cookie和Session           返回目录

1、Cookie的使用

首先修改sign/views.py:

def login_action(request):
    if request.method == "POST":
        username = request.POST.get("username","")
        password = request.POST.get("password","")
        if username == "123" and password == "1":
            # 添加浏览器cookie
            response = HttpResponseRedirect("/event_manage/")
            # "user":cookie名;username获取登录用户名;3600cookie再浏览器保持时间
            response.set_cookie("user",username,3600)
            return response
        else:
            return render(request,"index.html",{"error" : "Django login is error!"})

def event_action(request):
    # "user":读取cookie名
    username = request.COOKIES.get("user","")
    return render(request,"event_manage.html",{"cookie":username})

修改templates/event_manage.html:

    <div style="float: left">
        <a>欢迎{{ username }}到来!</a>
    </div>

页面登录成功后:

通过谷歌浏览器查看Cookie信息:

2、Session的使用

但是考虑到安全问题,还是Session靠谱。

修改sign/views.py:

def login_action(request):
    if request.method == "POST":
        username = request.POST.get("username","")
        password = request.POST.get("password","")
        if username == "123" and password == "1":
            # HttpResponseRedirect:这个类可以重定向指定页面
            response = HttpResponseRedirect("/event_manage/")
            # "user":cookie名;username获取登录用户名;3600cookie再浏览器保持时间
            # response.set_cookie("user",username,3600)   # 添加浏览器cookie
            request.session["user"] = username # 将session信息记录到浏览器中
            return response
        else:
            return render(request,"index.html",{"error" : "Django login is error!"})

def event_action(request):
    # username = request.COOKIES.get("user","") # "user":读取cookie名
    username = request.session.get("user","")   #读取浏览器session
    return render(request,"event_manage.html",{"username":username})

进行登录操作,但是报错:

提示:no such table: django_session,是因为session必须要有存储的地方才可以,我们需要创建django_session

再项目guest下,输入命令行:

# 输入命令python manage.py migrate

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK

再进行登录,并查看session信息。

三、Django认证系统             返回目录

1、登录Admin后台

首先需要创建管理员账号,再终端输入:

test:guest zhan$ python manage.py createsuperuser
Username (leave blank to use ‘zhan‘): admin                 # 输入用户名
Email address: xxx@xxx.com                              # 输入邮箱
Password:                                     # 输入密码
Password (again):                                # 再次输入密码
This password is too short. It must contain at least 8 characters.  # 密码太短,并且不到8位
This password is too common.                         # 密码太简单
This password is entirely numeric.                     # 密码是数字
Password:
Password (again):
Error: Your passwords didn‘t match.                     # 密码不匹配
Password:
Password (again):
Superuser created successfully.
test:guest zhan$ 

登录网址:http://127.0.0.1:8000/admin/

输入用户名密码后登录:

2、引用Django认证登录

修改sign/views.py

def login_action(request):
    if request.method == "POST":
        username = request.POST.get("username","")
        password = request.POST.get("password","")
        # authenticate()函数接受用户名密码两个参数,并判断如果窜在返回user,不存在返回None
        user = auth.authenticate(username=username,password=password)
        if user != None:
            auth.login(request,user)    # 登录
            # HttpResponseRedirect:这个类可以重定向指定页面
            response = HttpResponseRedirect("/event_manage/")
            request.session["user"] = username  # 将session信息记录到浏览器中
            return response
        else:
            return render(request,"index.html",{"error" : "Django login is error!"})

修改完成之后,通过跟后台系统用户名密码相关联,进行验证登录。

3、关上窗户

为什么要单独讲这一节呢,因为有一个现象时,直接登录成功页面:http://127.0.0.1:8000/event_manage/,发现直接就可以登录成功,但是这个往往是不行的,应该必须通过登录操作才可以进入登陆成功页面,所以我们只需要简单加个东西就好了。

修改sign/views.py:

from django.contrib.auth.decorators import login_required

......

# 限制
@login_required
def event_action(request):
    username = request.session.get("user","")   #读取浏览器session
    return render(request,"event_manage.html",{"username":username})

只需要加入@login_required,即可。

注意:需要清理缓存。

但是,地址指向让它指向登录页面就更好啦。

修改guest/urls.py,增加新的路径:

urlpatterns = [
   ......
    url(r‘^$‘, views.index),        # 8080地址也可以访问登录页面
    ......
    url(r‘^accounts/login/$‘, views.index),         # 访问登陆成功页面,自动跳转登录页面
]

此时访问:

http://127.0.0.1:8000/

http://127.0.0.1:8000/index/

http://127.0.0.1:8000/event_manage/

都可以访问登录页面。

本部分完结, 下一章将会介绍Django模型(二),操作数据库的。

原文地址:https://www.cnblogs.com/Owen-ET/p/9776842.html

时间: 2024-10-08 02:16:49

【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(一)】的相关文章

用python+django+twistd 开发一个属于自己的运维系统

开源的运维系统不少,比如nagios.zabbix.cati等等,但是遇到自己个性化的运维需求的时候,总是显的力不从心!最近在学习python,所以就考虑用python+django+twisted来定做一个完全个性化的运维系统. 运维系统有几个主要的功能:监控.分析.报警.更甚者直接根据分析的结果进行反应操作.而以上几点通过上述的框架可以比较容易的实现. 下面上图说明: 使用freemind整理了下思路: 下面是一些代码段,完整的代码下载见文档底部: Server: #!/usr/bin/en

Python全栈开发-web框架之django

一:web框架 什么是web框架? Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性. web应用的流程: //浏览器发送一个HTTP请求: //服务器收到请求,生成一个HTML文档: //服务器把HTML文档作为HTTP响应的Body发送给浏览器: //浏览器收到HTTP响应,从HTTP

Django快速开发之投票系统

参考官网文档,创建投票系统. ================ Windows  7/10 Python 3.6 Django 2.0* ================ 1.创建项目(mysite)与应用(polls) D:\pydj>django-admin.py startproject mysite D:\pydj>cd mysite D:\pydj\mysite>python manage.py startapp polls 添加到setting.py # Applicatio

Django Web开发【1】Django简介

前言 看完<Django Book>之后, 总想找个实例来实战开发下,无奈国内Django的书籍相当少,只能从英文书籍中吸取养料,偶然之后得到Learning Website Development with Django这本书,感觉挺不错,虽然想着翻译,但是自身时间实在太少,只能简略的挑重点翻译下了. 原书08年的时候就出版了,所以它使用的Django版本比较低,由于自身工作的环境使用的是Django1.3.5,所以迁移过来有些代码变化也比较大. 这是我的第一篇原创博客(翻译也算不上吧),希

用django框架开发一个B2C购物网站的基本流程和用到的知识点总结1

开发流程 开发模式采用前后端分离模式,作为后端开发人员我们只关注后端业务逻辑开发: 省略项目框架搭建文件的配置部分.... 一:用户部分 在项目开发中我们要用到用户模型类User,Django认证系统提供了用户模型类User和User的相关操作方法:自带的用户模型无法满足我们的要求时需要自定义用户模型添加格外字段: 如: 在创建好的应用models.py中定义用户的用户模型类. class User(AbstractUser): """用户模型类""&qu

Django Web开发【2】Django入门

配置开发环境 1.安装Python,我使用的是centos 6.0,python版本为2.6.6 2.安装Django,Django版本为1.3.5 在Django官网下载对应版本之后,解压压缩包,进入压缩包目录,运行 python setup.py install 可以通过以下命令检查是否正确安装了Django. django-admin.py --version 如果结果输出了Django的版本,则安装成功. 3.安装数据库,这里使用Mysql,请自行安装.  创建第一个项目 在linux终

Python之路,Day20 - 分布式监控系统开发

Python之路,Day20 - 分布式监控系统开发 本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设计思路及架构解藕原则 常用监控系统设计讨论 Zabbix Nagios 监控系统需求讨论 1.可监控常用系统服务.应用.网络设备等 2.一台主机上可监控多个不同服务.不同服务的监控间隔可不同 3.同一个服务在不同主机上的监控间隔.报警阈值可不同

Ubuntu中使用Docker/LXC迅速启动一个桌面系统

2013年07月18日 | 标签: cloud, container, docker, lxc | 作者:vpsee Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常方便.因为使用 了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法.更

使用 Docker/LXC 迅速启动一个桌面系统

使用 Docker/LXC 迅速启动一个桌面系统 Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常方便.因为使用 了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是 docker 最普遍的一个玩法.更多的玩法还有大规模 web 应用.数据库部署.持续部署.集群.测试环