[Flask教程] 8.注册和登录功能实现(1)—— 页面设计和获取POST数据

在导航条中,右侧有登录和注册两个链接,储存用户数据的Users模型也有了,现在我们来实现登录和注册的功能。
先来看注册功能的实现,新建一个视图函数,如下:

@app.route('/register/')
def register():
    return render_template('register.html')

在导航条模板base.html中,为注册添加链接,使用url_for函数将其href属性值修改为register.html,如下:

<li><aregister') }}">注册</a></li>

接下来我们要去制作register.html了,这部分是基础的html/css知识,控件也是用的Bootstrap框架,最终注册页http://127.0.0.1:5000/register/的效果图如下(结尾贴出代码):

register.html中的表单控件,我们设置了其方法为POST,注册按钮的type为submit,这样点击提交按钮的时候,浏览器就会以POST方法去请求当前网址,但我们的视图函数默认只能接受GET方法,因此我们要为其添加POST方法,并使用flask中的request对象获取表单提交的数据,最终视图函数代码如下:

@app.route('/register/', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template('register.html')
    else:
        username = request.form.get('username')
        password1 = request.form.get('password1')
        password2 = request.form.get('password2')
        print(username, password1, password2)
        return ' '

request.form.get方法需要传入表单控件的name属性的值,这样就能获取到对应的填入到表单中的值了,为了演示,我们在结尾将其打印了出来,结果显示无误,说明后端已经获取到了POST提交的数据。
登陆页面也是一样的原理,拿register.html简单修改成login.html,模仿register再增加一个login视图函数,然后访问http://127.0.0.1:5000/login/,效果如下:

结尾贴上register.html的内容:

{% extends 'base.html' %}

{% block static_files %}
<linkstatic',filename='css/register_login.css.css') }}"/>
{% endblock %}

{% block page_name %}注册{% endblock %}

{% block body_part %}
<h3>注册</h3>
<form action="">
    <div>
      <span>用户</span>
      <input aria-describedby="sizing-addon1">
    </div>
    <div>
      <span>密码</span>
      <input aria-describedby="sizing-addon1">
    </div>
    <div>
      <span>密码</span>
      <input aria-describedby="sizing-addon1">
    </div>
    <div>
        <button>注册</button>
    </div>
</form>
{% endblock %}

代码中引入的register_login.css是register.html和login.html通用的,其内容如下:

h3{
    text-align: center;
    padding-top: 10px;
}

.form{
    width: 400px;
    margin: 0 auto;
}

form.form > div{
    padding: 8px;
}

此外还对导航条模板做了简单的调整,第一是增加了一个block,给每个继承它的html一个放自定义css文件的地方,第二是在body中增加了一个div块,即register.html和login.html中间白色的内容区域,最终base.html代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta>
    <link>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <linkstatic',filename='css/base.css') }}"/>
    <linkstatic',) }}">
    {% block static_files %}{% endblock %}
    <title>{% block page_name %}{% endblock %}-HarpQA</title>
</head>
<body>
    <nav><!-- 导航条内容 -->
        ...省略...
        <li><alogin') }}">登录</a></li>
        <li><aregister') }}">注册</a></li>
        ...省略...
    </nav>
    <div>
        {% block body_part %}
        {% endblock %}
    </div>
</body>
</html>

base.css 也添加了 <div> 的样式:

.body-container{
    width: 600px;
    background: white;
    margin: 0 auto;
    border-radius: 5px;
}
标签:Flask 发布于:2019-10-29 20:21:00