zoukankan      html  css  js  c++  java
  • Python之Flask框架项目Demo入门

    Python+Flask框架项目Demo入门

      本例子用到了 Flask+蓝图+Flask-Login+SQLAlchemy+WTForms+PyMySQL相关架构

    Flask Web框架介绍

      Flask是微型web框架,框架本身十分精简,微型并不代表其功能弱,核心代码基于Werkzeug, Jinja 2 这两个库,它以插件形式的进行功能扩展,且插件易于安装与使用,并且可以自行开发扩展插件

    与其他web框架类似,flask中请求(request),路由(route),响应(response)构成其完整的一个基本http流程。

    flask流行的主要原因:

    1. 有非常齐全的官方文档,上手非常方便
    2. 有非常好的拓展机制和第三方的拓展环境,工作中常见的软件都有对应的拓展,自己动手实现拓展也很容易
    3. 微型框架的形式给了开发者更大的选择空间

    蓝图介绍

      在Flask项目中可以用Blueprint(蓝图)实现模块化的应用,使用蓝图可以让应用层次更清晰,开发者更容易去维护和开发项目。蓝图将作用于相同的URL前缀的请求地址,将具有相同前缀的请求都放在一个模块中,这样查找问题,一看路由就很快的可以找到对应的视图,并解决问题了。

      蓝图提供模板过滤器、静态文件、模板和其它功能

    Flask扩展库

    Flask-Login库

      Flask-Login 通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user)

      login_user() 函数:实现用户的登入,一般在登入的视图函数中调用

      logout_user() 函数:实现登出功能

      current_user 属性:获取当前用户
      对于使用者来说,如果需要页面是授权用户才可见,在相应视图函数前加上 @login_required 装饰器进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到 LoginManager.login_view 所指定的视图

    Flask-Script库

      提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开;

      Flask Script和Flask本身的工作方式类似,只需定义和添加从命令行中被Manager实例调用的命令;

    WTForms表单

      WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

    简单代码例子:

    class Myvalidators(object):
        '''自定义验证规则'''
        def __init__(self,message):
            self.message = message
        def __call__(self, form, field):
            print(field.data,"用户输入的信息")
            if field.data == "haiyan":
                return None
            raise validators.ValidationError(self.message)
    
    class LoginForm(Form):
        '''Form'''
        name = simple.StringField(
            label="用户名",
            widget=widgets.TextInput(),
            validators=[
                Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则
                validators.DataRequired(message="用户名不能为空"),
                validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")
            ],
            render_kw={"class":"form-control"}  #设置属性
        )
    
        pwd = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="密码不能为空"),
                validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),
                validators.Regexp(regex="d+",message="密码必须是数字"),
            ],
            widget=widgets.PasswordInput(),
            render_kw={"class":"form-control"}
        )
    
    
    
    @app.route('/login',methods=["GET","POST"])
    def login():
        if request.method =="GET":
            form = LoginForm()
            return render_template("login.html",form=form)
        else:
            form = LoginForm(formdata=request.form)
            if form.validate():
                print("用户提交的数据用过格式验证,值为:%s"%form.data)
                return "登录成功"
            else:
                print(form.errors,"错误信息")
            return render_template("login.html",form=form)
    

      login.html

    <body>
    <form action="" method="post" novalidate>
        <p>{{ form.name.label }} {{ form.name }} {{ form.name.errors.0 }}</p>
        <p>{{ form.pwd.label }} {{ form.pwd }} {{ form.pwd.errors.0 }}</p>
        <input type="submit" value="提交">
        <!--用户名:<input type="text">-->
        <!--密码:<input type="password">-->
        <!--<input type="submit" value="提交">-->
    </form>
    </body>
    

      

    SQLAlchemy

      SQLAlchemy是一个很强大的关系型数据库框架,支持多种数据库后台。SQLAlchemy提供了高层ORM,也提供了使用数据库原生SQL的低层功能。

      ORM:将对对象的操作转换为原生SQL

        优点
        易用性,可以有效减少重复SQL
        性能损耗少
        设计灵活,可以轻松实现复杂查询
        移植性好

     

    示例代码

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    
    class Student(db.Model):
    
        s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        s_name = db.Column(db.String(16), unique=True)
        s_age = db.Column(db.Integer, default=1)
    
        __tablename__ = "student"
    

      

    其中:

    Integer表示创建的s_id字段的类型为整形,

    primary_key表示是否为主键

    String表示该字段为字符串

    unique表示该字段唯一

    default表示默认值

    autoincrement表示是否自增

    最后代码地址

    github项目代码地址: 示例项目地址

    项目运行效果截图

  • 相关阅读:
    react native android9 axios network error
    .NET Core3.1升级.NET5 oracle连接报错
    asp.net mvc api swagger 配置
    ASP.NET Core3.1 中使用MongoDB基本操作
    基于.NET Core3.1的SQLiteHelper增删改帮助类
    linux离线安装gcc 和g++
    简单验证两次密码输入是否相同
    循环结构-回文数
    《暴走大事件》为80、90后正名
    循环结构-判断一个数是否为完全数(C语言)
  • 原文地址:https://www.cnblogs.com/owenma/p/11238943.html
Copyright © 2011-2022 走看看