python web框架Flask后台登录

项目搭建

创建一个项目之后,需要在手动创建几个包(含有__init__.py文件的目录)和文件

1、在主目录下创建配置文件:config.py

2、在主目录下创建扩展文件:exts.py

3、在主目录下创建管理文件(供在命令行使用):manage.py

4、在主目录下创建app包,在app包下再创建cms包管理后台的文件

5、在cms包下创建views.py文件管理视图函数、models.py文件管理数据库模型、forms.py文件管理表单验证

填写配置文件

在配置文件下配置密钥、数据库连接等(配置文件的所有变量必须是全部大写)

主目录/config.py
import os

SECRET_KEY = os.urandom(24)

DEBUG = True

SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/forum"
SQLALCHEMY_TRACK_MODIFICATIONS = False

填写扩展文件

Flask框架封装了数据库的一些操作,将其置为扩展包falsk-sqlalchemy,只需要实例化SQLAlchemy对象

主目录/exts.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

创建应用app

在入口文件定义一个创建app的方法,供蓝图使用,这里说的蓝图就是app包下的包(模块).由于本篇博客实现的是后台登录,即涉及表单验证,所以需要防止csrf注入攻击

主目录/app.py
from flask import Flask
from flask_wtf import CSRFProtect
from apps.cms import bp as cms_bp
from apps.cms import login_manager as cms_login_manager

import config
from exts import db

def create_app():
    """
    主入口文件创建app,供其他蓝图使用
    :return: 返回一个app
    """
    app = Flask(__name__)
    # 防止csrf注入攻击
    CSRFProtect(app)
    # 注册蓝图模块
    app.register_blueprint(cms_bp, url_prefix="/cms")

    # 导入配置文件
    app.config.from_object(config)
    # 数据库db初始化app
    db.init_app(app)
    # 后台登录login_manager初始化app
    cms_login_manager.init_app(app)
    return app

if __name__ == ‘__main__‘:
    app = create_app()
    app.run()

初始化蓝图

cms包下有一个初始化py文件,一般是用来供导包的

主目录/app/cms/__init__.py
from .views import bp
from .views import login_manager

创建用户模型

在蓝图中的模型文件中创建用户模型,即在cms包下的models.py文件创建。创建模型已作详细说明

主目录/app/cms/models.py
from exts import db
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin

class CMSUser(db.Model, UserMixin):
    """
    定义一个类名,系统将类转换为表格,表名为cms_user
    定义类的属性就是表格的字段名
    为了安全性,可以将用户表的password属性置为保护属性如    _password
    为了方便用户操作保护属性像操作普通属性一样,需要装饰 _password
    在设置密码的过程中,需要对密码加密——>调用generate_password_hash()
    另外定义一个校验密码的方法check_password()
    在校验密码的过程中,需要对密码解密——>调用check_password_hash()
    """
    __tablename__ = "cms_user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(50), nullable=False)
    _password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(50), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)

    def __init__(self, username, password, email):
        self.username = username
        self.password = password
        self.email = email

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, raw_password):
        """
        设置密码
        :param raw_password: 前端后台传入的密码参数
        :return:没有返回值
        """
        self._password = generate_password_hash(raw_password)

    def check_password(self, raw_password):
        """
        校验密码,将数据库的存入的密码解密之后再与传入的密码参数匹配
        :param raw_password: 前端后台传入的密码参数
        :return: True or False
        """
        result = check_password_hash(self.password, raw_password)
        return result

迁移并同步到数据库中

Flask框架不像Django框架可以直接使用命令行生成迁移文件并同步到数据库当中,Flask框架需要借助flask_script包下的管理类Manager、flask_migrate包下的迁移类Migrate和一些相关的迁移命令类MigrateCommand。

1、先获取app对象

2、再实例化一个管理对象manage,绑定到app上

3、将app应用与db数据库对象绑定到迁移类中

4、将迁移文件中用到的命令封装成 db (这个db不是db数据库对象),调用add_command()添加到manage中

5、完成上面几个文件的代码填充,可以在命令行中输入相关命令,这里不做解释,代码中有提示

主目录/manage.py
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import create_app
from exts import db
from apps.cms import models as cms_models

# 获取模型中定义的类
CMSUser = cms_models.CMSUser

app = create_app()
# 定义Manager类实例化对象
manage = Manager(app)

# 将app应用与db数据库绑定到迁移文件中
Migrate(app, db)
# 将迁移文件用到的命令换成db开头(manage.py文件可以自定义命令)添加到manage中
manage.add_command("db", MigrateCommand)

@manage.option("-u", "--username", dest="username")
@manage.option("-p", "--password", dest="password")
@manage.option("-e", "--email", dest="email")
def create_cms_user(username, password, email):
    """
    自定义创建后台用户的命令,在cmd命令行中输入类似于如下命令,即可添加用户:(在虚拟环境下)
        python manage.py db create_cms_user -u 用户名 -p 密码 -e 邮箱地址
    :param username:
    :param password:
    :param email:
    :return: 返回一提示消息
    """
    user = CMSUser(username=username, password=password, email=email)
    db.session.add(user)
    db.session.commit()
    print("cms用户添加成功")

if __name__ == "__main__":
    manage.run()

表单验证

对前端后台登录的表单提供的数据进行验证,需要借助flask_wtf包下的FlaskForm类

主目录/app/cms/forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField
from wtforms.validators import DataRequired, Length, Email

class LoginForm(FlaskForm):
    email = StringField(validators=[DataRequired(message="请输入邮箱地址"), Email(message="请输入正确的邮箱格式")])
    password = StringField(validators=[Length(6, 20, message="请输入正确格式的密码")])
    remember = IntegerField()

渲染页面

这里没有设置页面,就不渲染页面,直接返回一个字符串标识一下即可。渲染页面做的事情一般是在views.py中实现的,这个views.py文件采用了两种方式:视图函数和基于调度方法的类视图。

这里有必要提一下:对于没有登录的行为,是不能访问主页(这里是指登录成功之后跳转的页面)。实现这一要求,我们需要从flask_login包下导入login_user、logout_user、login_required、LoginManager

1、和上面一样,实例化LoginManager对象login_manager也要初始化app(在入口文件app.py会有一行代码)

2、对于没有登录的用户我们需要给一个重定向(我们把它作为重定向)。这个实例化对象有一个属性login_view,给其赋值(值是一个url)

3、最重要的一点:调用了login_user()会自动生成一个session值,调用了logout_user()会自动删除这一个session值。这个session值是通过装饰器@login_manager.user_loader修饰的函数生成

4、视图函数和类视图已在代码中作详细说明

主目录/app/cms/views.py
from flask import Blueprint, views, render_template, request, session, redirect, url_for
from flask_login import login_required, LoginManager
from flask_login import login_user
from .forms import LoginForm
from .models import CMSUser

# 指定没有登录时重定向的页面,需要将LoginManager的实例化对象初始化app(在入口文件中)
login_manager = LoginManager()
login_manager.login_view = "cms.login"
# 定义蓝图对象
bp = Blueprint("cms", __name__)

@bp.route("/")
@login_required
def index():
    return "cms index"

class LoginView(views.MethodView):
    """
    get方法对应前端后台的get请求,主要是渲染页面
    post方法对应前端后台的post请求:
        1、先验证用户的输入是否符合表单验证的要求,如果不符合要求,则返回具体的错误
        2、先通过邮箱查找用户并通过查找的用户密码与后台表格密码进行验证,如果没有找到,返回邮箱或者密码错误
        3、匹配成功则通过login_user(user)自动保存session值
        4、通过获取前端后台的remember值给session定义过期时间,默认是浏览器会话关闭
    """
    def get(self, message=None):
        return render_template("cms/cms_login.html", message=message)

    def post(self):
        form = LoginForm(request.form)
        if form.validate():
            email = form.email.data
            password = form.password.data
            remember = form.remember.data
            user = CMSUser.query.filter(CMSUser.email == email).first()
            if user and user.check_password(password):
                # 自动生成一个session值
                login_user(user)

                if remember:
                    # 设置session的过期时间,默认为31天
                    session.permanent = True
                    return redirect(url_for("cms.index"))
                return redirect(url_for("cms.index"))
            else:
                return self.get(message="邮箱或者密码错误")
        else:
            message = form.errors.popitem()[1][0]
            return self.get(message=message)

bp.add_url_rule("/login", view_func=LoginView.as_view("login"))

@login_manager.user_loader
def load_user(user_id):
    """
    后台用户类必须继承UserMixin,以防用户表没有定义校验的字段,如:is_active等
    :param user_id:
    :return:
    """
    return CMSUser.query.get(user_id)

这样一个后台登录实现已经实现了,能帮助到大家,点个赞,加个关注,诚挚感谢!

原文地址:https://www.cnblogs.com/aitiknowledge/p/11641463.html

时间: 2024-08-29 08:20:20

python web框架Flask后台登录的相关文章

python web框架Flask——csrf攻击

CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站.尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左.XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站.与XS

IIS 部署 python web框架 Flask

IIS的安装就不说了吧,然后运行:inetmgr ,打开iis管理器,打开 Web平台安装程序,(如果没有,百度下载安装一下吧),然后是安装--IIS:CGI 这个包. 接下来,添加网站,添加处理程序模块映射: 这里一定要进入网站控制台内的"处理程序映射",不要在IIS控制台直接进入,不然创建的FastCGI会对所有网站生效 右面点击"添加模块映射",具体内容如下,python路径|wfastcig.py文件的路径. 可执行文件一栏输入"python程序&

python web框架Flask——手机短信验证码

下列代码都是以自己的项目实例讲述的,相关的文本内容很少,主要说明全在代码注释中. 我是使用阿里云云通信的短信服务,第一次使用会摸不着头绪,这里我们需要做些准备工作: 1.登陆自己的账号进入阿里云官网,没有账号的朋友们自行注册 2.在导航栏上搜索“短信服务”,没有添加的话应该会有“免费开通”按钮,再进入管理控制台(我们需要添加这个短信服务板块,这样控制台会有短信服务这个模块),管理控制台的页面: 3.添加api密钥,成功之后会自行生成一个入口api密钥 id 和 secret. 4.在第一张图片上

python web框架Flask——图形验证码及验证码的动态刷新

下列代码都是以自己的项目实例讲述的,相关的文本内容很少,主要说明全在代码注释中 自制图形验证码 这里所说的图形验证码都是自制的图形,通过画布.画笔.画笔字体的颜色绘制而成的.将验证码封装成一个类比较好管理,代码里有绝对详细的注释,当然大家可以直接复制. 里面涉及的字体都是从系统电脑上自带的,大家直接复制当前目录下就可以了. 主目录/utils/captcha/__init__.py import random import string # Image:一个画布 # ImageDraw:一个画笔

python web框架分析和学习篇_彭友

分析篇: 刚好到网上搜到了一篇<浅谈Python web框架>,里面系统的分析了五种主流的Python框架,现在python的主流框架有Django.Pylons&TurboGears&repose.bfg.Tornado&web.py&Bottle&Flask和Quixote.它从宏观角度分析了这五种框架的优劣,看完之后我们决定选择Django,因为: Django: 概述:可谓是python框架里面最大的一家,它是里面文档最完善.市场占有率最高.招聘

浅谈五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 导读:作者飞龙写了一篇<浅谈Python Web框架>,文中他介绍了几个Python Web框架和自己对选择框架的分析.在他看来,用Django来快速开发一些Web运用是很不错的选择.以下是文章内容: 说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: http://wik

浅谈Python web框架

一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: 官网相关的链接:http://wiki.python.org/moin/WebFrameworks 虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在P

Python web 框架 Sanci如何使用?

本文和大家分享的主要是python web 框架 Sanci 相关内容,一起来看看吧,希望对大家学习python有所帮助. Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快. 除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求.这意味着你可以使用新的 async/await 语法,编写非阻塞的快速的代码. 既然它说速度特别快,我们先看下官方提供的 基准测试结果. Sanic基准测试 这个测试的程序运行在 AWS 实例上,系统是Ubu

微型 Python Web 框架 Bottle

Bottle 是一个非常小巧但高效的微型 Python Web 框架, 它被设计为仅仅只有一个文件的Python模块, 并且除Python标准库外, 它不依赖于任何第三方模块. 路由(Routing): 将请求映射到函数, 可以创建十分优雅的 URL 模板(Templates): Pythonic 并且快速的 Python 内置模板引擎, 同时还支持 mako, jinja2, cheetah 等第三方模板引擎 工具集(Utilites): 快速的读取 form 数据, 上传文件, 访问 coo