目录

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. 我是先学C语言还是先学C++,实不相瞒,鱼和熊掌可兼得!

    这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图. 实不相瞒,这类问题之前也经常看到.     每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊 ...

  2. 旋转子段 (思维stl)

    题目: 大概意思就是给你一个序列,你可以选择一段区间使它左右翻折一遍,然后呢,从1到n找一遍,看a[i]==i的数最多是多少. 其实刚才我已经把暴力思路说出来了,枚举每一个区间长度,枚举每一个左端点, ...

  3. jquery ui,拖拽,dragsort

    一.导入js.导入jquery.dragsort.js外还需要导入jQuery. 二.HTML部分 <!DOCTYPE html> <html> <head> &l ...

  4. 第三章 TCP/IP 模型

    一.产生背景 1.伴随着计算机网络的飞跃发展,各大厂商根据自己的协议生产出了不同的硬件和软件 2.为了实现网络设备间的互相通讯,ISO和IEEE相继提出了OSI参考模型及其TCP/IP模型 二.TCP ...

  5. EFS加密

    目录 EFS简介 EFS的特点 EFS的缺陷 EFS证书 证书的导出 证书的安装 EFS加密 方法一 方法二 EFS简介 EFS(Encrypting File System,加密文件系统)是Wind ...

  6. tomcat 登录主页成功 点击Manager App 401 等问题

    1.将项目部署在tomcat的安装路径webapps下(如果报404,查下该应用是否在tomcat的webapps下部署着) 2.启动tomcat成功,http://127.0.0.1:8080成功, ...

  7. 框架篇:Linux零拷贝机制和FileChannel

    前言 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域.但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO.netty.kafka遇到的零拷贝,并不是不复制数据 ...

  8. [String] intern()方法

    intern()方法设计的初衷,就是重用String对象,以节省内存消耗. JDK1.6以及以前版本中,常量池是放在 Perm 区(属于方法区)中的,熟悉JVM的话应该知道这是和堆区完全分开的. 使用 ...

  9. Redis学习笔记(六)——数据结构之Set

    一.介绍 Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis中集合是通过哈希表实现的,所以添加.删除.查找的复杂度都是O(1). 集合中 ...

  10. 专题二:redis的数据类型之string

    一.redis的数据存储格式 redis本身是一个Map,其中所有的数据都是采用 "key:value"的方式进行存储的. 我们说的数据类型是数据存储的类型,也就是对应下图的val ...