首页 > 其他分享 >Flask框架

Flask框架

时间:2024-04-16 19:13:35浏览次数:25  
标签:__ name 框架 Flask app request url

一、 简介
Flask是一个非常小的PythonWeb框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用
二、 概要
1)安装: pip install flask
2)组成:WSGI系统、调试、路由
3)模板引擎:Jinja2(由Flask核心开发者人员开发)
4)使用到装饰器:以@开头的代码方法

  1. Flask基础入门
    1)路由route的创建:
    1、通过创建路由并关联函数,实现一个基本的网页:
    from flask import Flask

    用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容

    app = Flask(name)

    程序实例需要知道每个url请求所对应的运行代码是谁。

    所以程序中必须要创建一个url请求地址到python运行函数的一个映射。

    处理url和视图函数之间的关系的程序就是"路由",在Flask中,路由是通过@app.route装饰器(以@开头)来表示的

    @app.route("/")

    url映射的函数,要传参则在上述route(路由)中添加参数申明

    def index():
    return "Hello World!"

    直属的第一个作为视图函数被绑定,第二个就是普通函数

    路由与视图函数需要一一对应

    def not():

    return "Not Hello World!"

    启动一个本地开发服务器,激活该网页

    app.run()

2、通过路由的methods指定url允许的请求格式:
from flask import Flask

  app = Flask(__name__)

  #methods参数用于指定允许的请求格式
  #常规输入url的访问就是get方法
  @app.route("/hello",methods=['GET','POST'])
  def hello():
      return "Hello World!"
  #注意路由路径不要重名,映射的视图函数也不要重名
  @app.route("/hi",methods=['POST'])
  def hi():
      return "Hi World!"

  app.run()

3、通过路由在url内添加参数,其关联的函数可以接收该参数:
from flask import Flask

  app = Flask(__name__)

  # 可以在路径内以/<参数名>的形式指定参数,默认接收到的参数类型是string

  '''#######################
  以下为框架自带的转换器,可以置于参数前将接收的参数转化为对应类型
  string 接受任何不包含斜杠的文本
  int 接受正整数
  float 接受正浮点数
  path 接受包含斜杠的文本
  ########################'''

  @app.route("/index/<int:id>",)
  def index(id):
      if id == 1:
          return 'first'
      elif id == 2:
          return 'second'
      elif id == 3:
          return 'thrid'
      else:
          return 'hello world!'

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

4、除了原有的转换器,我们也可以自定义转换器(pip install werkzeug):
from werkzeug.routing import BaseConverter #导入转换器的基类,用于继承方法
from flask import Flask

  app = Flask(__name__)

  # 自定义转换器类
  class RegexConverter(BaseConverter):
      def __init__(self,url_map,regex):
          # 重写父类定义方法
          super(RegexConverter,self).__init__(url_map)
          self.regex = regex

      def to_python(self, value):
          # 重写父类方法,后续功能已经实现好了
          print('to_python方法被调用')
          return value

  # 将自定义的转换器类添加到flask应用中
  # 具体过程是添加到Flask类下url_map属性(一个Map类的实例)包含的转换器字典属性中
  app.url_map.converters['re'] = RegexConverter
  # 此处re后括号内的匹配语句,被自动传给我们定义的转换器中的regex属性
  # value值会与该语句匹配,匹配成功则传达给url映射的视图函数
  @app.route("/index/<re('1\d{10}'):value>")
  def index(value):
      print(value)
      return "Hello World!"

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


  from werkzeug.routing import BaseConverter #导入转换器的基类,用于继承方法
  from flask import Flask

  app = Flask(__name__)

  # 自定义转换器类
  class RegexConverter(BaseConverter):
      def __init__(self,url_map,regex):
          # 重写父类定义方法
          super(RegexConverter,self).__init__(url_map)
          self.regex = regex

      def to_python(self, value):
          # 重写父类方法,后续功能已经实现好了
          print('to_python方法被调用')
          return value

  # 将自定义的转换器类添加到flask应用中
  # 具体过程是添加到Flask类下url_map属性(一个Map类的实例)包含的转换器字典属性中
  app.url_map.converters['re'] = RegexConverter
  # 此处re后括号内的匹配语句,被自动传给我们定义的转换器中的regex属性
  # value值会与该语句匹配,匹配成功则传达给url映射的视图函数
  @app.route("/index/<re('1\d{10}'):value>")
  def index(value):
      print(value)
      return "Hello World!"

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

  from werkzeug.routing import BaseConverter #导入转换器的基类,用于继承方法
  from flask import Flask

  app = Flask(__name__)

  # 自定义转换器类
  class RegexConverter(BaseConverter):
      def __init__(self,url_map,regex):
          # 重写父类定义方法
          super(RegexConverter,self).__init__(url_map)
          self.regex = regex

      def to_python(self, value):
          # 重写父类方法,后续功能已经实现好了
          print('to_python方法被调用')
          return value

  # 将自定义的转换器类添加到flask应用中
  # 具体过程是添加到Flask类下url_map属性(一个Map类的实例)包含的转换器字典属性中
  app.url_map.converters['re'] = RegexConverter
  # 此处re后括号内的匹配语句,被自动传给我们定义的转换器中的regex属性
  # value值会与该语句匹配,匹配成功则传达给url映射的视图函数
  @app.route("/index/<re('1\d{10}'):value>")
  def index(value):
      print(value)
      return "Hello World!"

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

2)endpoint的作用:
说明:每个app中都存在一个url_map,这个url_map中包含了url到endpoint的映射;
作用:当request请求传来一个url的时候,会在url_map中先通过rule找到endpoint,然后再在view_functions中根据endpoint再找到对应的视图函数view_func
from flask import Flask

app = Flask(__name__)

# endpoint默认为视图函数的名称
@app.route('/test')
def test():
    return 'test success!'
# 我们也可以在路由中修改endpoint(当视图函数名称很长时适用)
# 相当于为视图函数起别名
@app.route('/hello',endpoint='our_set')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    print(app.view_functions)
    print(app.url_map)
    app.run()
可以通过view_functions查看到当前endpoint与视图函数的对应情况;
可以通过url_map查看当前url与endpoint的绑定情况;
# view_functions
{'static': <function Flask.__init__.<locals>.<lambda> at 0x00000230CC2A7DC0>, 'test': <function test at 0x00000230CC30FD30>, 'our_set': <function hello_world at 0x00000230CC30FDC0>}
# url_map
Map([<Rule '/hello' (OPTIONS, HEAD, GET) -> our_set>,
 <Rule '/test' (OPTIONS, HEAD, GET) -> test>,
 <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
 * Serving Flask app 'endpoint_test' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

3)request对象的使用
什么是request对象?
render_template():可以用于呈现一个我们编写的html文件模板
request.method用于获取url接收到的请求方式,以此返回不同的响应页面

request:包含前端发送过来的所有请求数据

from flask import Flask,render_template,request

用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容

app = Flask(name)

@app.route("/",methods=['GET','POST'])

url映射的函数,要传参则在上述route(路由)中添加参数申明

def index():
if request.method == 'GET':
# 想要html文件被该函数访问到,首先要创建一个templates文件,将html文件放入其中
# 该文件夹需要被标记为模板文件夹,且模板语言设置为jinja2
return render_template('index.html')
# 此处欲发送post请求,需要在对应html文件的form表单中设置method为post
elif request.method == 'POST':
name = request.form.get('name')
password = request.form.get('password')
return name+" "+password

if name=='main':
app.run()

4)请求钩子before/after_request
想要在正常执行的代码的前、中、后时期,强行执行一段我们想要执行的功能代码,便要用到钩子函数——用特定装饰器装饰的函数。

下面将介绍Flask内,四种常用的钩子:

before_request:在每一次请求之前调用;
该钩子函数表示每一次请求之前,可以执行某个特定功能的函数;
执行顺序是先绑定的先执行;
并且先执行 flask app 的 before_request, 再执行 blueprint 的 before_request;
一般用于检验用户权限、请求是否合法等场景;
from flask import Flask
app = Flask(name)

@app.route('/')
def hello_world():
return 'Hello World!'

@app.before_request

2、before_first_request:与before_request的区别是,只在第一次请求之前调用;
该钩子函数表示第一次请求之前可以执行的函数;
执行顺序同样也是先绑定的先执行;

代码替换视图函数hello_world后,if main前

@app.before_first_request
def teardown_request_a():
print('I am in teardown_request_a')

@app.before_first_request
def teardown_request_b():
print('I am in teardown_request_b')

打印结果 -=-=-=-=-=-=-=-=-=-=-=-=-=

I am in teardown_request_a
I am in teardown_request_b

3、after_request:每一次请求之后都会调用;

该钩子函数表示每一次请求之后,可以执行某个特定功能的函数,这个函数接收response对象,所以执行完后必须归还response对象;
执行的顺序是先绑定的后执行;
被触发的前提是没有异常抛出,或者异常被 errorhandler捕获并处理;
一般可以用于产生csrf_token验证码等场景;

def before_request_a():
print('I am in before_request_a')

@app.before_request
def before_request_b():
print('I am in before_request_b')

if name == 'main':
app.run()

打印结果 -=-=-=-=-=-=-=-=-=-=-=-=-=

I am in teardown_request_a
I am in teardown_request_b

4、teardown_request:每一次请求之后都会调用;
该钩子函数接收一个参数,该参数是服务器出现的错误信息;
执行顺序也是先绑定的后执行;
只有在请求上下文被 pop 出请求栈的时候才会直接跳转到teardown_request;
所以在被正常调用之前,即使某次请求有抛出错误,该请求也都会被继续执行, 并在执行完后返回 response;

代码替换视图函数hello_world后,if main前

@app.teardown_request
def teardown_request_a(exc):
print('I am in teardown_request_a')

@app.teardown_request
def teardown_request_b(exc):
print('I am in teardown_request_b')

打印结果 -=-=-=-=-=-=-=-=-=-=-=-=-=

I am in teardown_request_b
I am in teardown_request_a

5)redirect重定向
什么是redirect重定向?
在flask 中,重定向是通过flask.redirect(location, code=302)这个函数来实现的,location表示需要重定向的url, 应该配合url_for函数来使用, code表示采用哪个重定向,默认是302,即临时性重定向, 可以修改为301来实现永性重定向;
from flask import Flask,redirect,url_for

app = Flask(name)

@app.route('/index')
def index():
# redirect重定位(服务器向外部发起一个请求跳转)到一个url界面;
# url_for给指定的函数构造 URL;
# return redirect('/hello') 不建议这样做,将界面限死了
return redirect(url_for('hello'))

@app.route('/hello')
def hello():
return 'this is hello fun'

if name == 'main':
app.run()

6)返回json数据给前端
方法一:使用:make_response方法和json库共同完成
from flask import Flask,make_response,json

app = Flask(name)

@app.route("/index")
def index():
data = {
'name':'张三'
}

json.dumps 将一个python数据结构转化为json

json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False

生成一个response响应对象,而不是直接return来返回响应对象,便于执行更多的后续操作

response = make_response(json.dumps(data,ensure_ascii=False))

修改数据的MIME标准类型为json(在发送数据前会先发送该类型)

response.mimetype = 'application/json'
return response

if name=='main':
app.run()

方法二:使用:jsonify库实现,减少代码行数
from flask import Flask,jsonify

app = Flask(name)

在Flask的config是一个存储了各项配置的字典

该操作是进行等效于ensure_ascii=False的配置

app.config['JSON_AS_ASCII'] = False

@app.route("/index")
def index():
data = {
'name':'张三'
}
return jsonify(data)

if name=='main':
app.run()

7)abort函数的使用
什么是abort()?
使用类似于python中的raise函数,可以在需要退出请求的地方抛出错误,并结束该请求;
我们可以使用errorhandler()装饰器来进行异常的捕获与自定义:
from flask import Flask,render_template,request,abort

app = Flask(name)

@app.route("/",methods=['GET','POST'])
def index():
if request.method == 'GET':
return render_template('index.html')
elif request.method == 'POST':
name = request.form.get('name')
password = request.form.get('password')
if name == 'zhangsan' and password == '123456':
return 'login sucess'
else:
# abort的用法类似于python中的raise,在网页中主动抛出错误
abort(404)
return None

自定义错误处理方法,将404这个error与Python函数绑定

当需要抛出404error时,将会访问下面的代码

@app.errorhandler(404)
def handle_404_error(err):
# return "发生了错误,错误情况是:%s"%err
# 自定义一个界面
return render_template('404.html')

if name == 'main':
app.run()

标签:__,name,框架,Flask,app,request,url
From: https://www.cnblogs.com/07jjz/p/18138974

相关文章

  • Python Flask+Pandas读取excel显示到html网页: CSS控制表格样式
    前言全局说明CSS控制表格样式一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563修改内容后,要重启flask服务,修改才能生效四、CSS控制表格样式4.1.2文件名:index.pyfrom......
  • flask框架图书管理系统服务器端
    fromflaskimportFlask,request,jsonifyapp=Flask(__name__)books=[{'id':1,'title':'book1','author':'au1'},{'id':2,'title':'book2','author':'au2'},......
  • flask框架图书管理系统客户端
    importrequestsimportjson#Flask应用的URLbase_url='http://localhost:5000'#获取所有图书defget_all_books():response=requests.get(f'{base_url}/books')ifresponse.status_code==200:returnresponse.json()else:print(f&#......
  • Python Flask+Pandas读取excel显示到html网页:CSS控制表格样式
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、CSS控制表格样式4.1.2文件名:index.pyfromflaskimportFlaskapp=Flask(__name__)@app.route("/excel......
  • Python Flask+Pandas读取excel显示到html网页: 没有excle文件提示
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、没有excle文件提示4.1.2文件名:index.py添加tryexcept获取没有文件的异常fromflaskimportFlaskapp......
  • Python Flask+Pandas读取excel显示到html网页: 环境搭建显示内容
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563Pandas安装https://www.cnblogs.com/wutou/p/17811839.html四、环境搭建4.1.2文件名:index.pyfromflaskimp......
  • 第三十一节:批量插入框架[Zack.EFCore.Batch]和EFCore8.x自带的批量删除、更新
    一. 说明1.目标 这里主要测试EFCore8.x版本提供的批量删除和批量更新;以及老杨的框架[Zack.EFCore.Batch] 以SQLServer为载体进行测试。2.准备(1).需要的程序集  必须的程序集:  Microsoft.EntityFrameworkCore.Tools  EF自身的程序集:Microsoft.......
  • 前端开发框架的选择-Vue.js
    Vue.js秉持简约哲学,通过精炼的代码实现功能——它专注于为Web应用开发提供核心工具,而非让冗余特性成为负担。这种简约设计思路使得代码更加明晰,易于阅读和维护。长远看来,Vue.js的简约特性使得项目运作更为流畅。无论是小型网站还是大型单页应用,Vue.js都能轻松应对——它并非万金......
  • 分享一款嵌入式开源按键框架代码工程MultiButton
    一、工程简介MultiButton是一个小巧简单易用的事件驱动型按键驱动模块。Github地址:https://github.com/0x1abin/MultiButton这个项目非常精简,只有两个文件:(1)可无限扩展按键;(2)按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让按键业......
  • 3小时搞定DRF框架 | Django REST framework前后端分离框架实践
    DRF(全称DjangoRESTframework)是一个用于构建WebAPI的强力工具集,是一个基于Django的PythonWeb框架,它为开发人员提供了一套快速开发RESTfulAPI的工具,它能够自动化API可视化、文档化,实现接口的自动化测试以及自动化的API路由、序列化、视图、验证、分页、版本管理、认证等......