
 Flask是一种轻量级Web应用框架,使用Python编写。它是一个简单易用的框架,适合构建小型到中型的Web应用程序。Flask提供了基本的Web开发功能,如路由、请求处理、模板渲染、文件上传等。
下面是Flask的一些基础语法
文章目录
- 1.静态文件处理
 - 2.Flask中的配置文件
 - 2.1 基于全局变量的方式
 - 2.2 基于类的方式
 
- 3.路由和视图
 - 3.1 路由写法
 - 3.2视图写法
 
- 4.模板传参和全局方法
 - 4.1 模板传参
 - 4.2 全局模板方法定义
 
- 5.装饰器
 - 5.1装饰器语法
 - 5.2其它装饰器
 
1.静态文件处理
文件夹目录

- app.py
 
from flask import Flask, render_template
# 静态文件处理
# static_folder:静态文件所在文件夹
# static_url_path:静态文件url文件夹路径
app = Flask(__name__, static_folder='static', static_url_path="/yy/yy")
@app.route('/')
def hello_world():
    return  render_template('test.html')
if __name__ == '__main__':
    app.run()
 
- test.html
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="{{ url_for("static",filename='/2345_image_file_copy_2.jpg')}}">
<img src="/yy/yy/2345_image_file_copy_2.jpg">
</body>
</html>
 
- 结果:
 
<img src="{{ url_for("static",filename='/2345_image_file_copy_2.jpg')}}">,这一种方式方便管理
 
2.Flask中的配置文件
2.1 基于全局变量的方式
- configs/settings.py
 
from datetime import timedelta
flask_ENV='development'
SECRET_KEY = '_5#y2L"F4Q8zxec]/'
SQLALCHEMY_DATABASE_URI = 'XXXX'
UPLOAD_FOLDER = "XXX"
PERMANENT_SESSION_LIFETIME = timedelta(days=7)
#导入其它配置文件的配置,如果同名会将这里的覆盖掉
try:
    from .localsettings import *
except ImportError:
    pass   
 
- app.py
 
from flask import Flask
app = Flask(__name__)
#从配置文件中导入文件
app.config.from_object("configs.settings")
@app.route('/')
def hello_world():
    #读取参数app.config.get() 或者 current_app.config.get()
    return app.config.get('UPLOAD_FOLDER')
if __name__ == '__main__':
    app.run()
 
2.2 基于类的方式
- configs/settings.py
 
from datetime import timedelta
#公共配置,被其它类继承
class BaseSettings(object):
    SECRET_KEY = '_5#y2L"F4Q8zxec]/'
class DevSetting(BaseSettings):
    flask_ENV = 'development'
    DEBUG=True
    HOST:"xx.xx.xx.xx"
    SQLALCHEMY_DATABASE_URI = 'XXXX'
    UPLOAD_FOLDER = "Dev_Path"
class ProdSettings():
    HOST: 'xx.xx.xx.xx'
    SQLALCHEMY_DATABASE_URI = 'XXXX'
    UPLOAD_FOLDER = "Pro_Path"
    PERMANENT_SESSION_LIFETIME = timedelta(days=7)
 
- app.py
 
from flask import Flask
app = Flask(__name__)
app.config.from_object("configs.settings.DevSettings")
@app.route('/')
def hello_world():
    #读取参数app.config.get() 或者 current_app.config.get()
    return app.config.get('UPLOAD_FOLDER')
if __name__ == '__main__':
    app.run()
 
3.路由和视图
3.1 路由写法
- 一般写法
 
@app.route('/login')
def login():
return render_template('login.html')
 
- 动态路由
 
@app.route('/login/<name>')
def login(name):
    print(type(name))
    return render_template('test.html')
@app.route('/login/<int:age>')
def login(age):
    print(type(age))
    return render_template('test.html')
 
3.2视图写法
- 视图函数
 
@app.route('/login')
def login():
    return render_template('login.html')
 
- 视图类
 
from flask import Flask,render_template,views
app = Flask(__name__)
def decorator1(func):
    def inner(*args,**kwargs):
        print('before1')
        result = func(*args,**kwargs)
        print('after1')
        return result
    return inner
def decorator2(func):
    def inner(*args,**kwargs):
        print('before2')
        result = func(*args,**kwargs)
        print('after2')
        return result
    return inner
class UserView(views.MethodView):
    #允许的请求类型
    methods = ['GET',"POST"]
    #装饰器,这里加了两个装饰器
    decorators = [decorator1,decorator2]
    # 执行GET请求
    def get(self):
        print('get')
        return 'get'
    # 执行POST请求
    def post(self):
        print('post')
        return 'post'
    
# 第一个参数为路由路径,第二个相当于endpoint="user"
app.add_url_rule('/user', view_func=UserView.as_view('user')) 
if __name__ == '__main__':
    app.run()
 
执行结果:

4.模板传参和全局方法
4.1 模板传参
传入的参数可以是多种类型,也可以是方法,如下面的func就是一个方法
- app.py
 
from flask import Flask,render_template
app = Flask(__name__)
def func(name):
    return '你好,' + name
@app.route('/test')
def index():
    info = ["奇幻","智能建造小硕","公众号"]
    return render_template('test.html',info=info,f=func)
if __name__ == '__main__':
    app.run()
 
-  
test.html
Flask使用Jinja2模板语法
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>作者:{{ info[0] }}</h1><br>
<h1>{{ info[2] }}:{{ info[1] }}</h1><br>
<h1>{{ f("欢迎关注~") }}</h1>
</body>
</html>
 
结果:
 
4.2 全局模板方法定义
模板中可以直接使用,不用作为参数传入方法。
注意:蓝图中定义的全局模板方法只能在蓝图模板范围内可以使用
#全局方法
#可以不用再响应函数中传,直接在HTML中把global的函数名写上即可
@app.template_global() #  {{ func1("XXX") }}
def func1(arg):
    "xxx"
    return  arg
#过滤器
#过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,这就用到了过滤器。 
#过滤器的使用方式为:变量名 | 过滤器。 过滤器名写在变量名后面,中间用 | 分隔。
#第一个参数是你要过滤的那个值(自身),Flask内有很多自带的过滤器
@app.template_filter() # {{ "arg1"|func2(arg2) }}
def func2(arg1,arg2):
    "..."
    return XXX 
 
5.装饰器
5.1装饰器语法
#自定义一个用户验证的装饰器
def auth(func):
    @wraps(func)
    def inner(*args,**kwargs):
        if 'username' in session:
            logsuccessmsg = f"登录成功{session['username']}"
            flash(logsuccessmsg)
            return func(*args,**kwargs) 
        # flash和它的名字一样,是闪现,意思就是我们的消息只会显示一次,当我们再次刷新也面的时候,它就不存在了,而正是这点,它经常被用来显示一些提示消息,比如登陆之后,显示欢迎信息等。
    else:
        flash("登录失败!")
        return redirect(url_for("login"))
    return  inner
#使用用户验证路由,判断是否登录,登录才能进入首页,否则进入登录页面
@app.route('/')
@app.route('/index')
@auth #相当于: auth(index())
def index():
    return render_template("index.html", account_name=session["username"],books=Books.query.all())
 
5.2其它装饰器
from flask import Flask,render_template,request
app = Flask(__name__)
@app.before_request #在请求执行之前执行
def before_request1():
    if request.path == '/login':
        return   
    print('before_request1')
    # return 'XXX' ,如果有return,这返回return的值,后面的不执行,可以作为用户验证
@app.after_request 
def after_request1(response):
    print('after_request1')
    return response # 一定要有return,为请求执行返回的结果
# 处理异常,接受参数,可以重定向到指定页面
@app.errorhandler(Exception)
def error(e):
    print("error")
    return redirect("/")
@app.route('/index')
def index():
    print('index')
    return render_template('index.html')
if __name__ == '__main__':
    app.run()
 
Flask是一个灵活和易用的框架,可以帮助我们快速构建Web应用程序。如果您想深入了解Flask的更多功能和用法,请参阅Flask官方文档。
 https://dormousehole.readthedocs.io/en/2.1.2/index.html
希望有所帮助!喜欢就点个赞吧!


















