Python Flask: 实现用户注册功能

来自CloudWiki
Cloud17讨论 | 贡献2022年1月16日 (日) 07:52的版本
跳转至: 导航搜索

创建注册路由

在manage.py入口文件中,创建一个名为app的Flask实例,

然后用app.route()函数创建路由。

from flask import Flask, render_template, flash, redirect, url_for, session, request, logging
from mysql_util import MysqlUtil
from passlib.hash import sha256_crypt

app = Flask(__name__) # 创建应用

# 用户注册
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm(request.form) # 实例化表单类


    return render_template('register.html', form=form) # 渲染模板板

创建模板文件

创建模板文件

render_template()函数默认查找的模板文件路径"/templates",

在该路径下创建register.html

{% extends 'layout.html' %}

{% block body %}
<div class="content">
  <h1 class="title-center">用户注册</h1>
  {% from "includes/_formhelpers.html" import render_field %}
  <form method="POST" action="">
    <div class="form-group">
      {{render_field(form.email, class_="form-control")}}
    </div>
    <div class="form-group">
      {{render_field(form.username, class_="form-control")}}
    </div>
    <div class="form-group">
      {{render_field(form.password, class_="form-control")}}
    </div>
    <div class="form-group">
      {{render_field(form.confirm, class_="form-control")}}
    </div>
    <p><input type="submit" class="btn btn-primary" value="注册"></p>
  </form>
</div>
{% endblock %}

创建公共文件

layout.html

在templates目录下创建公共文件layout.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>读书笔记</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/css/style.css">
    <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </head>
  <body>
    {% include 'includes/_navbar.html' %}
    <div class="container">
      {% include 'includes/_messages.html' %}
      {% block body %}{% endblock %}
    </div>
    {% include 'includes/_footer.html' %}
  </body>
</html>

includes/_navbar.html

在templates目录的下 创建子目录includes,并创建文件_navbar.html

<nav class="navbar navbar-default">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="/">学习笔记</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li><a href="/">主页</a></li>
            <li><a href="/articles">笔记</a></li>
            <li><a href="/about">关于</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">
            {% if session.logged_in %}
              <li><a href="/dashboard">控制台</a></li>
              <li><a href="/logout">退出</a></li>
            {% else %}
              <li><a href="/register">注册</a></li>
              <li><a href="/login">登录</a></li>
            {% endif %}
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

includes/_messages.html

在templates目录的子目录includes下,创建文件_messages.html

{% with messages = get_flashed_messages(with_categories=true) %}
  {% if messages %}
    {% for category, message in messages %}
      <div class="alert alert-{{ category }}">{{ message }}</div>
    {% endfor %}
  {% endif %}
{% endwith %}

{% if error %}
  <div class="alert alert-danger">{{error}}</div>
{% endif %}

{% if msg %}
  <div class="alert alert-success">{{msg}}</div>
{% endif %}

includes/_footer.html

在templates目录的子目录includes下,创建文件_footer.html

<!-- Footer -->
<footer class="page-footer font-small blue" style="margin-top: 50px">
  <!-- Copyright -->
  <div class="footer-copyright text-center py-3">
      Copyright ©2007-2019 <a href="http://www.mingrisoft.com">明日科技有限公司</a>
      All Rights Reserved 吉ICP备10002740号-2 吉公网安备22010202000132
  </div>
  <!-- Copyright -->
</footer>
<!-- Footer -->


includes/_formhelpers.html

在templates目录的子目录includes下,创建文件_formhelpers.html

在该文件中定义了一个宏render_field

{% macro render_field(field) %}
  {{ field.label }}
  {{ field(**kwargs)|safe }}
  {% if field.errors %}
    {% for error in field.errors %}
      <span class="help-inline text-danger">{{ error }}</span>
    {% endfor %}
  {% endif %}
{% endmacro %}

实现注册功能

通过request.method 判断是否提交了表单,

然后通过form.validate() 进行字段验证,

获取信息,并加密,

将信息写入数据库

跳转到登陆页面 并显示成功信息

如果注册失败,则显示注册信息。

 
from flask import Flask, render_template, flash, redirect, url_for, session, request, logging
from mysql_util import MysqlUtil
 
from passlib.hash import sha256_crypt
from forms import RegisterForm,ArticleForm

app = Flask(__name__) # 创建应用

# 用户注册
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm(request.form) # 实例化表单类
    if request.method == 'POST' and form.validate(): # 如果提交表单,并字段验证通过
        # 获取字段内容
        email = form.email.data
        username = form.username.data
        password = sha256_crypt.encrypt(str(form.password.data)) # 对密码进行加密

        db = MysqlUtil() # 实例化数据库操作类
        sql = "INSERT INTO users(email,username,password) \
               VALUES ('%s', '%s', '%s')" % (email,username,password) # user表中插入记录
        db.insert(sql)

        flash('您已注册成功,请先登录', 'success') # 闪存信息
        return redirect(url_for('login')) # 跳转到登录页面

    return render_template('register.html', form=form) # 渲染模板

if __name__ == '__main__':#程序入口
    app.secret_key='secret123'
    app.run()#让应用运行在本地服务器上。





效果图

Python220116.png