目录

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加载配置

from flask import Flask

app = Flask(__name__)

# 配置类
class Config():
DEBUG = True # 开启调试模式 # 通过app.config来加载配置
app.config.from_object(Config) @app.route(rule="/")
def index():
return "<h1>python31</h1>" if __name__ == '__main__':
app.run(port=8000,host="0.0.0.0")

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

from flask import Flask

app = Flask(__name__)

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

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

from flask import Flask

app = Flask(__name__)

class Config():
DEBUG = True app.config.from_object(Config) # 路由转换器对路由参数的类型进行限定
@app.route(rule="/<float:user_id>")
def index(user_id):
print(type(user_id)) # <class 'float'>
return "user_id=%s" % user_id if __name__ == '__main__':
app.run()

7.自定义路由转换器

from flask import Flask

app = Flask(__name__)

class Config():
DEBUG = True app.config.from_object(Config) # 自定义路由转换器
# 1. 声明的路由转换器类必须直接或间接继承于BaseConverter
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
# 2. 必须在初始化中调用父类对象进行初始化
def __init__(self,*args,**kwargs):
# 3. regex必须有参数
self.regex = r"1[3-9]\d{9}"
super().__init__(*args,**kwargs) # 4. 注册你自己定义的路由转换器
# app.url_map.converters["使用别名"] = 转换器类名
app.url_map.converters["mob"] = MobileConverter @app.route(rule="/<mob:user_id>")
def index(user_id):
print(type(user_id)) # <class 'float'>
return "user_id=%s" % user_id if __name__ == '__main__':
app.run()

8.路由限定请求方式

from flask import Flask

app = Flask(__name__)

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

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

from flask import Flask

app = Flask(__name__)

def index():
return "ok" # 也可以让路由注册和视图进行分离
app.add_url_rule(rule="/",view_func=index) if __name__ == '__main__':
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

from flask import Flask,request
from werkzeug.datastructures import ImmutableMultiDict app = Flask(__name__) @app.route("/form",methods=["POST","PUT","PATCH"])
def get_form():
print(request) # HTTP请求处理对象 # 接受post提交表单数据
print(request.form)
"""打印效果:
ImmutableMultiDict([('username', 'xiaoming'), ('password', '123456'), ('lve', 'swimming'), ('lve', 'game'), ('lve', 'shopping')])
# ImmutableMultiDict 这个类就是一个字典的子类,我们可以称之为类字典对象,所以可以通过字典的操作来使用。
# 思路来源: from collection import OrderedDict
""" # 获取指定键的单个值
print(request.form.get("username"))
print(request.form["username"]) # 和上面的一样,没有区别 print(request.form["lve"]) # 如果键对应的数据有多个值,则不能通过get或中括号 # 获取指定键获取多个值
print(request.form.getlist("lve")) # ['swimming', 'game', 'shopping'] # 格式转换:to_dict()
# ImmutableMultiDict 转换成基本格式
# 注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值
ret = request.form.to_dict() # {'username': 'xiaoming', 'password': '123456', 'lve': 'swimming'} return "ok" if __name__ == '__main__':
app.run(debug=True)

2.request.其他

from flask import Flask,request
from werkzeug.datastructures import ImmutableMultiDict app = Flask(__name__) @app.route("/query")
def get_query_params():
"""获取查询字符串 query_params"""
"""127.0.0.1:5000/?username=xiaoming&age=18"""
print(request.args)
"""打印效果:
ImmutableMultiDict([('username', 'xiaoming'), ('age', '18')])
"""
print(request.args.to_dict()) # {'username': 'xiaoming', 'age': '18'}
return "ok" @app.route("/head")
def get_head():
"""获取请求头数据"""
print(request.headers)
print(request.headers["Content-Type"]) # application/x-www-form-urlencoded # 获取自定义请求头[首字母大写,不支持多个单词使用横杠进行拼接的写法,也不支持多字节字符]
print(request.headers["Company"]) # oldboyedu
return "ok" @app.route("/",methods=["POST","GET"])
def index():
print(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"))
return "ok" if __name__ == '__main__':
app.run(debug=True)

11.flask的HTTP响应

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

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

页面响应: 重定向

​url_for 视图之间的跳转

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

1.响应html文本

from flask import Flask,request,make_response,Response,jsonify

app = Flask(__name__)

@app.route("/")
def 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数据

from flask import Flask,request,make_response,Response,jsonify

app = Flask(__name__)

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

3.重定向redirect

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

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

from flask import Flask,redirect,url_for

app = Flask(__name__)

@app.route("/index")
def index():
return "index" # 转内跳转,进行视图之间的跳转
@app.route("/")
def home():
# 视图之间的跳转
return redirect(url_for("index",name="xiaoming")) if __name__ == '__main__':
app.run(debug=True)

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

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

day92:flask:flask简介&基本运行&路由&HTTP请求和响应的更多相关文章

  1. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  2. Flask(1):基本示例、配置文件、路由、请求和响应、模板渲染

    Flask的特点: - pip install flask - 短小精悍.可扩展性强的 web框架 注意:上下文管理机制 - 依赖 wsgi:werkzeug Flask的简单示例: from fla ...

  3. Flask 基础组件(五):请求和响应

    from flask import Flask from flask import request from flask import render_template from flask impor ...

  4. Flask (一) 简介

    Flask简介 Flask是一个基于Python实现的Web开发‘微’框架 'MicroFramework' Django是一个重型框架 官方文档: http://flask.pocoo.org/do ...

  5. Flask - 四剑客 | templates | 配置文件 | 路由系统 | CBV

    Flask框架简介 说明:flask是一个轻量级的web框架,被称为微型框架.只提供了一个高效稳定的核心,其它全部通过扩展来实现.意思就是你可以根据项目需要进行量身定制,也意味着你需要不断学习相关的扩 ...

  6. Inside Flask - Flask 简介

    Inside Flask - Flask 简介 前言 Flask 的设计目标是实现一个 wsgi 的微框架,其核心代码保持简单和可扩展性,很容易学习.对于有一定经验初学者而言,跟着例子和一些书的代码来 ...

  7. Python框架学习之Flask中的视图及路由

    在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...

  8. flask session,蓝图,装饰器,路由和对象配置

    1.Flask 中的路由   *endpoint - url_for 反向地址  *endpoint 默认是视图函数名  *methods 指定视图函数的请求方式,默认GET  defaults={& ...

  9. Flask 学习(二)路由

    Flask  路由 在说明什么是 Flask 路由之前,详细阐述下 Flask “Hello World” 这一 最小应用的代码. Flask “Hello World” from flask imp ...

随机推荐

  1. day49 Pyhton 数据库Mysql 06

    多表查询 连表查询 要进行连接,那一定涉及两个表,两个表中要有关联条件才能进行连接 内连接 只有表一和表二中的连接条件都满足的时候才能显示出来 inner join on /where 条件 sele ...

  2. 身为电气人,为什么也要学习C语言编程?人生苦短,我学编程!

    说起编程大家可能都听过,但编程究竟是怎么一回事你弄懂了吗? 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机.办公的电脑.你点击的页面.浏览的网页,都是有程序让它执行你要它做的事情. PL ...

  3. 利用Docker搭建开发环境

    一. 前言 随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖.这些现象导致开 发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现 ...

  4. HTML DOM Document的实际应用

    HTML文档中可以使用以下属性和方法: 属性 / 方法 描述 document.activeElement 返回当前获取焦点元素 document.addEventListener() 向文档添加句柄 ...

  5. jinjia2语言

    金家兔 网站: https://jinja.palletsprojects.com/en/2.11.x/ #Jinja is Beautiful {% extends "layout.htm ...

  6. MySQL安装版本介绍

    MySQL安装 源码安装 二进制格式的程序包 程序包管理器安装 yum dnf MySQL在CentOS上的情况 6上只有mySQL 7上只有mariadb 8上既有mysql也有mariadb Ce ...

  7. day72:drf:

    目录 1.续:反序列化功能(5-8) 1.用户post类型提交数据,反序列化功能的步骤 2.反序列化功能的局部钩子和全局钩子 局部钩子和全局钩子在序列化器中的使用 反序列化相关校验的执行顺序 3.反序 ...

  8. Mysql JDBC-mysql-Driver queryTimeout分析

    Mysql jdbc的queryTimeout分析 Mysql的jdbc-driver com.mysql.jdbc.Driver 设置queryTimeout方法 com.mysql.jdbc.St ...

  9. JavaScript核心 Dom Bom

    <div id="time">2020-9-27</div> <script> //文档页面从上往下加载,先有标签才能获取元素对象,script ...

  10. angular页面

    <!DOCTYPE html><!--[if lt IE 9]> <html lang="zh" xmlns:ng="http://angu ...