Python 之 Flask框架(进阶版)

前面说了flask框架的基础用法,现在说一下Flask框架的进阶用法:

#包引入
from flask import Flask,redirect,url_for,render_template,request,make_response,send_file,abort,flash, get_flashed_messages,Blueprint,views
from os import urandom

app = Flask(__name__)
​​
@app.route('/admin')
def hello_admin():
    return 'Hello Admin'

@app.route('/guest/<guest>')
def hello_guest(guest):
    return 'Hello %s as Guest' % guest

#重定向
@app.route('/user/<name>')
def user(name):
    if name =='admin':
        return redirect(url_for('hello_admin'))
    else:
        return redirect(url_for('hello_guest',guest = name))

#模板引擎
@app.route('/htmltest')
def html_temp():
    dic = {"firts": 1, "second": 2, "thired": 3}
    return render_template('test.html', result=dic)

#自定错误页面
@app.errorhandler(404)
def errorhandler(e):
    return render_template("404.html"), 404

#辅助方法
@app.route('/home')
def home():
    print('cookies:', request.cookies)      # 获取cookies
    print('headers:', request.headers)      # 获取请求头信息
    print('method:', request.method)        # 请求方法
    print('url:', request.url)              # URL全部内容,请求地址加参数
    print('url_rule:', request.url_rule)    # 请求URL不含请求地址和参数
    print('url_root:', request.url_root)    # 请求地址
    print('host_url:', request.host_url)    # 与url_root类似
    print('base_url:', request.base_url)    # 请求地址和URL和,不含参数
    print('path:', request.path)            # 请求URL
    print('values:', request.values)        # 包含GET, POST请求的参数
    print('args:', request.args)            # 获取URL参数
    print('form:', request.form)            # 获取POST提交formdata的参数
    print('files:', request.files)          # 获取提交的文件
    print('json:', request.json)            # 获取header为applicaiton/json提交的数据

    return 'home page'

# 用于创建响应对象。它通常用于在视图函数中设置响应的内容、状态码和头部
@app.route('/page1')
def page1():
   resp = make_response('<h1>hello world</h1>')
   resp.headers['name'] = 'hello'
   return resp

#解除进程对SIGABRT信号的阻止,然后向调用进程发送该信号(阻止当去请求,跳转制定的状态)
@app.route('/page2')
def page2():
   abort(405)

# 从服务器端发送内存中的文件给客户端
@app.route('/page3')
def page3():
   return send_file('test.jpg')

#闪现(在视图函数调用flash()函数,传入消息内容,flash()函数把消息存储在session中,我们需要在模板中使用全局函数get_flashed_messages()获取消息并将它显示出)
#注意:app.secret_key = urandom(25)  ;flash消息存储在session中,一定要设置key值,相当于一个栈,访问一次/page4,相当于"hello","world","welcome"入栈一次,所以可以看到再次访问/page5,入栈的数据就会增加一次
#获取随机数(获取不同操作系统特定提供的随机源, 它可以被用来做随机加密的key使用)
app.secret_key = urandom(25)
@app.route('/page4')
def page4():
    flash('hello')
    flash('world')
    flash('welcome', 'success')
    return 'page4 page'

@app.route('/page5')
def page5():
    print(get_flashed_messages())
    return 'page5 page'

# 蓝图(路由组件,相当于路由分组组件,相当于Golang中的group)
# 定义
api = Blueprint('api', 'api')
admin = Blueprint('admin', 'admin')

# 相当于/api/page6(api相当于模块)
@api.route('/page6')
def page6():
    return 'api page6'

# 相当于/admin/page7(admin相当于模块)
@admin.route('/page7')
def page7():
    return 'admin page7'

# 注册
app.register_blueprint(api)
app.register_blueprint(admin)

#钩子函数(类似于php的laravel框架中的handle)
@app.route('/page8')
def page8():
    return 'page8'

@app.route('/page9')
def page9():
    return 'page9'

@app.before_request
def first_request():
    print('请求进入视图函数之前')

@app.after_request
def after_request(response):
    print('视图函数结束之前调用')
    return response

#cbv(装饰器:类似 restful API:相当于利用request.method去判断是页面还是操作,cbv就相当于集成版)
class Index(views.MethodView):
    def get(self):
        return 'get method page'

    def post(self):
        return 'post method page'


class Upload(views.MethodView):
    methods = ['GET', 'POST']
    def get(self):
        return """
        <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit">
    </form>
</body>
</html>

    def post(self):
        file = request.files['file']
        file.save(file.filename)
        return 'upload successful'


app.add_url_rule('/index', view_func=Index.as_view(name='index'))
app.add_url_rule('/upload', view_func=Upload.as_view(name='upload'))

if __name__ == '__main__':
    app.run()

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonFlask框架中,你可以使用Jinja2模板引擎来渲染HTML模板。以下是一个简单的示例: 首先,确保你已经安装了Flask和Jinja2模块。你可以使用以下命令来安装它们: ``` pip install flask pip install jinja2 ``` 接下来,创建一个名为app.py的Python文件,并在其中编写以下代码: ```python from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': app.run() ``` 接下来,创建一个templates文件夹,在该文件夹中创建一个名为index.html的HTML模板文件。在index.html中,你可以使用Jinja2模板语法来插入动态内容。以下是一个简单的示例: ```html <!DOCTYPE html> <html> <head> <title>Flask Template Example</title> </head> <body> <h1>Hello, {{ name }}!</h1> </body> </html> ``` 在上面的示例中,`{{ name }}` 是一个占位符,将在渲染模板时被实际的值替换。可以通过在render_template函数中传递关键字参数来提供这些值。例如,你可以将以下代码添加到index函数中: ```python @app.route('/') def index(): return render_template('index.html', name='John') ``` 这将把name的值设置为"John",并将其传递给index.html模板。当你访问应用的根URL时,将渲染模板并将结果返回给浏览器。 请注意,上述示例只是一个简单的模板用法示例。在实际应用中,你可以在模板中使用循环、条件语句和其他Jinja2模板语法来实现更复杂的功能。你可以参考Jinja2的官方文档来了解更多详细信息。 希望这个简单的示例能帮助到你开始使用Flask框架的模板功能!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值