加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

day92:flask:flask简介&基本运行&路由&HTTP请求和响

发布时间:2020-12-20 09:58:53 所属栏目:Python 来源:网络整理
导读:目录 1.Flask简介 2.关于使用flask之前的准备 3.flask的基本运行 4.flask加载配置 5.传递路由参数(没有限定类型) 6.传递路由参数(通过路由转换器限定路由参数的类型) 7.自定义路由转换器 8.路由限定请求方式 9.注册路由和视图代码进行分离 10.flask的HTT

目录

1.Flask简介

2.关于使用flask之前的准备

3.flask的基本运行

4.flask加载配置

5.传递路由参数(没有限定类型)

6.传递路由参数(通过路由转换器限定路由参数的类型)

7.自定义路由转换器

8.路由限定请求方式

9.注册路由和视图代码进行分离

10.flask的HTTP请求

11.flask的HTTP响应

1.Flask简介

Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。

Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。

其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。

官网: https://flask.palletsprojects.com/en/1.1.x/

官方文档: http://docs.jinkan.org/docs/flask/

Flask常用第三方扩展包

  • Flask-SQLalchemy:操作数据库,ORM;

  • Flask-script:终端脚本工具,脚手架;

  • Flask-migrate:管理迁移数据库;

  • Flask-Session:Session存储方式指定;

  • Flask-WTF:表单;

  • Flask-Mail:邮件;

  • Flask-Bable:提供国际化和本地化支持,翻译;

  • Flask-Login:认证用户状态;

  • Flask-OpenID:认证,OAuth;

  • Flask-RESTful:开发REST API的工具;

  • Flask JSON-RPC: 开发rpc远程服务[过程]调用

  • Flask-Bootstrap:集成前端Twitter Bootstrap框架

  • Flask-Moment:本地化日期和时间

  • Flask-Admin:简单而可扩展的管理接口的框架

可以通过 https://pypi.org/search/?c=Framework+%3A%3A+Flask 查看更多flask官方推荐的扩展

2.关于使用flask之前的准备

1.为flask单独安装一套虚拟环境

mkvirtualenv flask -p python3

2.在虚拟环境中安装flask

pip install flask==0.12.5

3.创建flask项目

与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件

例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境

3.flask的基本运行

from flask import Flask

# 创建应用对象
app = Flask(__name__)

 视图加载
@app.route(rule="/")  声明路由
def index():     声明视图函数
    return <h1>python31</h1>"   直接通过return返回普通字符串

if __name__ == '__main__':
     启动项目,不要在run 后面写任何代码,不会被执行到
    app.run(debug=True,port=8000,host=0.0.0.0 wsgiref模块提供的

4.flask加载配置

 Flask

app = Flask( 配置类
class Config():
    DEBUG = True  开启调试模式

 通过app.config来加载配置
app.config.from_object(Config)


@app.route(rule=") 
def index():    
    " 


:
    app.run(port=8000,1)">")

5.传递路由参数(没有限定类型)

 Flask

app = Flask( Config():
    DEBUG = True

app.config.from_object(Config)


 路由: 一种访问地址[url]和应用程序[视图]进行一对一绑定的映射关系
# 往往在开发中,我们所说的路由,其实通常指代完成路由绑定关系的路由类
@app.route(rule=/user/<user_id>-<mobile> 可以指定一个或多个参数进行传递
def index(user_id,mobile):  这里的参数名称必须和路由上面的保持一致。
    user_id=%s,mobile=%s" % (user_id,mobile)


:
    app.run() 

6.传递路由参数(通过路由转换器限定路由参数的类型)

 True

app.config.from_object(Config)

 路由转换器对路由参数的类型进行限定
@app.route(rule=/<float:user_id>")
def index(user_id):
    print(type(user_id))   <class 'float'>
    user_id=%s user_id


:
    app.run()

7.自定义路由转换器

 自定义路由转换器 1. 声明的路由转换器类必须直接或间接继承于BaseConverter
from werkzeug.routing  BaseConverter
 MobileConverter(BaseConverter):
     2. 必须在初始化中调用父类对象进行初始化
    def __init__(self,*args,**kwargs):
         3. regex必须有参数
        self.regex = r1[3-9]d{9}
        super().__init__(*args,1)">kwargs)

 4. 注册你自己定义的路由转换器 app.url_map.converters["使用别名"] = 转换器类名
app.url_map.converters[mob"] = MobileConverter

@app.route(rule=/<mob:user_id> user_id

:
    app.run()

8.路由限定请求方式

 路由转换器对路由参数的类型进行限定
'''@app.route(rule="/",methods=["POST","PUT","PATCH","DELETE"])'''
@app.route(rule= 没有填写第二个参数methods则默认只能通过get请求访问
 index():
    ok"

:
    app.run(debug=True)

9.注册路由和视图代码进行分离

 也可以让路由注册和视图进行分离
app.add_url_rule(rule=",view_func=index)

:
    app.run(debug=True)

10.flask的HTTP请求

文档: http://docs.jinkan.org/docs/flask/api.html#flask.request

  • request:flask中代表当前请求的 request 对象

  • 作用:在视图函数中取出本次请求数据

  • 导入from flask import request

  • 代码位置:from flask.app import Request

常用的属性如下:

属性 说明 类型
data 记录请求体的数据,并转换为字符串<br>只要是通过其他属性无法识别转换的请求体数据<br>最终都是保留到data属性中 bytes类型
form 记录请求中的html表单数据 MultiDict
args 记录请求中的查询字符串,也可以是query_string MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的请求头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件列表 *
json 记录ajax请求的json数据 json

?

?

?

?

?

?

?

?

?

?

?

1.request.form

 Flask,request
from werkzeug.datastructures  ImmutableMultiDict

app = Flask()

@app.route(/formPOSTPUTPATCH])
 get_form():
    print(request)  HTTP请求处理对象
    
     接受post提交表单数据
    print(request.form)
    """打印效果:
    ImmutableMultiDict([('username','xiaoming'),('password','123456'),('lve','swimming'),'game'),'shopping')])
    # ImmutableMultiDict 这个类就是一个字典的子类,我们可以称之为类字典对象,所以可以通过字典的操作来使用。
    # 思路来源: from collection import OrderedDict
    """
    
     获取指定键的单个值
    print(request.form.get(username))
    print(request.form["])  和上面的一样,没有区别

    lve 如果键对应的数据有多个值,则不能通过get或中括号

     获取指定键获取多个值
    print(request.form.getlist("))  ['swimming','game','shopping']

     格式转换:to_dict()
     ImmutableMultiDict 转换成基本格式
     注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
    ret = request.form.to_dict()  {'username': 'xiaoming','password': '123456','lve': 'swimming'}
    
    :
    app.run(debug=True)

2.request.其他

/query get_query_params():
    获取查询字符串 query_params"""
    127.0.0.1:5000/?username=xiaoming&age=18"""
    (request.args)
    print(request.args.to_dict()) 

@app.route(/head get_head():
    获取请求头数据(request.headers)
    print(request.headers[Content-Type application/x-www-form-urlencoded

     获取自定义请求头[首字母大写,不支持多个单词使用横杠进行拼接的写法,也不支持多字节字符]
    Company oldboyedu
    GETprint(request.method)  GET 获取本次客户端的请求方法名
    print(request.url)  http://127.0.0.1:5000/  url地址
    print(request.json)  {'pay_type': 1,'credit': 0,'coupon': 0} 获取json数据

    print(request.files)  ImmutableMultiDict([('video1',<FileStorage: 'demo.mp4' ('video/mp4')>)])
    print(request.files.get(video1:
    app.run(debug=True)

11.flask的HTTP响应

flask默认支持2种响应方式:

数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式

页面响应: 重定向

?url_for 视图之间的跳转

响应的时候,flask也支持自定义http响应状态码

1.响应html文本

 index():
    返回html数据"""

    这三种形式一模一样'''
     return "<h1>hello user</h1>"
     return make_response("<h1>hello user</h1>") # 上面的代码是这段代码的简写
     return Response("<h1>hello user</h1>") # 上面make_response本质上就是Response

2.响应json数据

 index():
    
    返回json格式数据 data = {"name":"xiaoming","age":13}
    return make_response(jsonify(data))
    return jsonify(data)  两种方式都可以响应json数据

3.重定向redirect

 redirect
 页面跳转响应
@app.route(/user user():
     页面跳转 redirect函数就是response对象的页面跳转的封装
    return redirect(http://www.baidu.com")

4.重定向到自己写的视图函数:url_for

/indexindex"


 转内跳转,进行视图之间的跳转
@app.route( home():
     视图之间的跳转
    return redirect(url_for(xiaoming))


:
    app.run(debug=True)

5.自定义状态码和响应头

@app.route(/demo4 demo4():
    状态码为 666',400
  
还可以使用make_response创建Response对象,然后通过response对象返回数据"""
 make_response
@app.route(/rep index7():
    response = make_response()
    (response)
    response.headers["] = oldboy"  自定义响应头
    response.status_code = 201  自定义响应状态码
    return response

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读