flask入门 快速入门后台写接口【API】【Python3】【无前端】【json格式】

flash官网手册地址:
https://dormousehole.readthedocs.io/en/latest/#api
https://github.com/BeyondLam/bili
新建项目
虚拟环境
- pycharm创建
- Linux下创建(服务器)
- python3 -m venv venv(创建虚拟环境)
- source venv/bin/activate(激活环境)


安装flask插件包
1)方式一:pycharm安装

2)方式二:命令行安装
$ pip install flask
新建hello_world.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "Hello World!"
if __name__ == '__main__':
app.run()
运行

访问: http://127.0.0.1:5000/
返回 Hello World!
debug调适
打断点--》debug运行 --》访问打断点的路由器http://127.0.0.1:5000/--》进入断点的位置--》单步调适

四、flask应用
from flask import Flask
app = Flask(__name__)
# http://127.0.0.1:5000/index
@app.route('/index')
def hello_index():
return "Hello Index!"
# http://127.0.0.1:5000/
@app.route('/')
def hello_world():
return "Hello World!"
if __name__ == '__main__':
# 在服务器上,不加host=’0.0.0.0‘只能本服务器内网访问
app.run(host='0.0.0.0')
flask路由
# http://127.0.0.1:5000/index
@app.route('/index')
def hello_index():
return "Hello Index!"
# http://127.0.0.1:5000/
@app.route('/')
def hello_world():
return "Hello World!"
变量规则
通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 converter:variable_name ,可以 选择性的加上一个转换器,为变量指定规则。请看下面的例子:
from markupsafe import escape
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return f'User {escape(username)}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return f'Post {post_id}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return f'Subpath {escape(subpath)}'
转换器类型:
| 类型 | 说明 |
|---|---|
| string | (缺省值) 接受任何不包含斜杠的文本 |
| int | 接受正整数 |
| float | 接受正浮点数 |
| path | 类似 string ,但可以包含斜杠 |
| uuid | 接受 UUID 字符串 |
唯一的 URL / 重定向行为
以下两条规则的不同之处在于是否使用尾部的斜杠。:
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
projects 的 URL 是中规中矩的,尾部有一个斜杠,看起来就如同一个文件 夹。访问一个没有斜杠结尾的 URL ( /projects )时 Flask 会自动进行重 定向,帮您在尾部加上一个斜杠( /projects/ )。
about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这 个 URL 时添加了尾部斜杠(/about/ )就会得到一个 404 “未找到” 错 误。这样可以保持 URL 唯一,并有助于搜索引擎重复索引同一页面。
flask重定向
# http://192.168.0.106:5000/baidu
# 重定向 需要引入 from flask import redirect
@app.route('/baidu') ## 加int后,参数只能传int
def baidu():
return redirect("https://baidu.com")
JSON 格式的 API demo1
@app.route("/me")
def me_api():
userInfo = {
"username": "lisi",
"theme": "user.theme",
"age": "30",
}
return userInfo
访问:
返回:
{
"age": "30",
"theme": "user.theme",
"username": "lisi"
}
JSON 格式的 API demo2
# http://192.168.0.106:5000/post_first
# post请求
"""
请求参考 post raw
{
"age": 30,
"theme": "user.theme",
"username": "lisi"
}
返回数据
# return rs
{
"age": 40,
"code": 200,
"data": null
}
=========================================================
# return jsonify(age=age, code=rs["code"], qData=qData)
{
"age": 30,
"code": 200,
"qData": {
"age": 30,
"theme": "user.theme",
"username": "lisi"
}
}
"""
from flask import Flask, request, jsonify
@app.route('/post_first', methods=["POST"])
def post_first():
try:
qData = request.get_json()
print(qData) # {'age': '30', 'theme': 'user.theme', 'username': 'lisi'}
username = qData.get("username1")
age = qData.get("age")
if not all([username,age]):
return jsonify(msg="username or age is not empty")
print(username) # 没有key的参数 打印None 返回给前端null
rs = {
"code": 200,
"data": username,
"age": age + 10,
}
# 以下返回json格式的数据
# return rs
# return jsonify(age=age, code=rs["code"], qData=qData)
return jsonify({"age": age, "code": rs["code"], "qData": qData})
except Exception as e:
errMsg = f"出错了, e:{e}"
print(errMsg)
return jsonify(msg=errMsg)
Cookies
要访问 cookies ,可以使用 cookies 属性。可以使用响应 对象 的 set_cookie 方法来设置 cookies 。请求对象的 cookies 属性是一个包含了客户端传输的所有 cookies 的字典。在 Flask 中,如果使用 会话 ,那么就不要直接使用 cookies ,因为 会话 比较安全一些。
读取 cookies:
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
# use cookies.get(key) instead of cookies[key] to not get a
# KeyError if the cookie is missing.
储存 cookies:
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
注意 cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们转换为响应对象。如果您想显式地转换,那么可以使用 make_response() 函数,然后再修改它。
会话
除了请求对象之外还有一种称为 session 的对象,允许您在不同请求 之间储存信息。这个对象相当于用密钥签名加密的 cookie ,即用户可以查看您的 cookie ,但是如果没有密钥就无法修改它。
使用会话之前您必须设置一个密钥。举例说明:
Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
code demo
from flask import Flask, request, jsonify
from flask import redirect
from flask import session
# from werkzeug.middleware.proxy_fix import ProxyFix
# from flask_esearch import ESearch # https://pypi.org/project/Flask-ESearch/
app = Flask(__name__)
app.secret_key = "12313123"
# http://127.0.0.1:5000/try/login
@app.route("/try/login", methods=["POST"])
def login():
'''
username admin
password 123455
'''
get_data = request.get_json()
user_name = get_data.get("username")
password = get_data.get("password")
if not all([user_name,password]):
return jsonify(errCode=400, msg="username or password not emtpy")
if user_name == "admin" and password == "123456":
session['user_name'] = "admin"
session['admin_id'] = "111"
session['avatar'] = "user_avatar.jpg"
return jsonify(errCode=200, msg="login success")
else:
return jsonify(errCode=400, msg="username or password error")
# http://127.0.0.1:5000/try/logout
@app.route("/try/logout", methods=["GET"])
def logout():
# session.pop('user_name',None)
session.clear()
return jsonify(errCode=200, msg="logout success")
# http://127.0.0.1:5000/session
@app.route("/session", methods=["GET"])
def check_session():
# 查检登陆状态
s_data = {
"user_name": session.get("user_name"),
"admin_id": session.get("admin_id"),
"avatar": session.get("avatar"),
}
# 从session中获取用户数据
if s_data["user_name"] is not None:
return jsonify(errCode=200, msg="true", data=s_data)
else:
return jsonify(errCode=400, msg="not login", data=s_data)
# http://127.0.0.1:5000/post_first
# post请求
"""
请求参考 post raw
{
"age": 30,
"theme": "user.theme",
"username": "lisi"
}
返回数据
# return rs
{
"age": 40,
"code": 200,
"data": null
}
=========================================================
# return jsonify(age=age, code=rs["code"], qData=qData)
{
"age": 30,
"code": 200,
"qData": {
"age": 30,
"theme": "user.theme",
"username": "lisi"
}
}
"""
@app.route('/post_first', methods=["POST"])
def post_first():
try:
qData = request.get_json()
print(qData) # {'age': '30', 'theme': 'user.theme', 'username': 'lisi'}
username = qData.get("username1")
age = qData.get("age")
if not all([username, age]):
return jsonify(msg="username or age is not empty")
print(username) # 没有key的参数 打印None 返回给前端null
rs = {
"code": 200,
"data": username,
"age": age + 10,
}
# 以下返回json格式的数据
# return rs
# return jsonify(age=age, code=rs["code"], qData=qData)
return jsonify({"age": age, "code": rs["code"], "qData": qData})
except Exception as e:
errMsg = f"出错了, e:{e}"
print(errMsg)
return jsonify(msg=errMsg)
# http://192.168.0.106:5000/me
@app.route("/me")
def me_api():
# app.wsgi_app = ProxyFix(app.wsgi_app)
userInfo = {
"username": "lisi",
"theme": "user.theme",
"age": "30",
}
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
return userInfo
# http://192.168.0.106:5000/baidu
# 重定向 需要引入 from flask import redirect
@app.route('/baidu') ## 加int后,参数只能传int
def baidu():
return redirect("https://baidu.com")
# http://192.168.0.106:5000/number_int/2
# 传递参数 规定参数类型 int / float / path / uuid
@app.route('/number_int/<int:number>') ## 加int后,参数只能传int
def hello_number_int(number):
return "number: %s!" % (number + number) # number: 4!
# http://192.168.0.106:5000/number_float/2.1
# 传递参数 规定参数类型 int / float / path / uuid
@app.route('/number_float/<float:number>') # 加float后,参数只能传float
def hello_number_float(number):
return "number: %s!" % (number + number) # number: 4.2!
# http://127.0.0.1:5000/hello/haima
# 传递参数
@app.route('/hello/<username>')
def hello_hello(username):
return "Hello %s!" % username
# http://127.0.0.1:5000/index
@app.route('/index')
def hello_index():
return "Hello Index!"
# http://127.0.0.1:5000/
@app.route('/')
def hello_world():
return "Hello World!"
if __name__ == '__main__':
# 在服务器上,不加host=’0.0.0.0‘只能本服务器内网访问 port=5001 指定端口
app.run(host='0.0.0.0', port=5000)
flask扩展仓库
https://pypi.org/search/?c=Framework+%3A%3A+Flask&o=&q=+Flask-mysql&page=4
flask入门 快速入门后台写接口【API】【Python3】【无前端】【json格式】的更多相关文章
- flask 框架快速入门
flask 框架快速入门 搭建一个简易flask项目 首先使用 Pycharm创建flask项目 运行flask项目 1.使用Pycharm搭建flask项目 (如果Pycharm新建项目中未出现该图 ...
- Flask的快速入门详细笔记
Flask的框架结构对应关系及理解 1.简介 简单介绍下Flask是一个轻量级的web前端框架,不像django那样本身具备一套完整的页面体系,轻量级说明了完全可以自定义,从功能逻辑到业务处理,都可以 ...
- 使用Asp.net WebAPI 快速构建后台数据接口
现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...
- angularJS入门小Demo2 【包含不用数据库而用data.json格式响应前台的ajax请求方式测试】
事件绑定: <html> <head> <title>angularJS入门小demo-5 事件指令</title> <script src=&q ...
- 8-2 开发接口 (入参是json格式)
1.开发入参事json格式的接口 import json import tools import flask from .check_session import check_session serv ...
- charles抓取线上接口数据替换为本地json格式数据
最近要做下拉刷新,无奈测试服务器的测试数据太少,没有足够的数据做下拉刷新,所以用charles抓取了测试服务器的接口,然后在伪造了很多数据返回到我的电脑上,下面来说说使用方法: 第一步: 安装FQ软件 ...
- DataTables学习:从最基本的入门静态页面,使用ajax调用Json本地数据源实现前端开发深入学习,根据后台数据接口替换掉本地的json本地数据,以及报错的处理地方,8个例子(显示行附加信息,回调使用api,动态显示和隐藏列...),详细教程
一.DataTables 个人觉得学习一门新的插件或者技术时候,官方文档是最根本的,入门最快的地方,但是有时候看完官方文档,一步步的动手写例子,总会出现各种莫名其妙的错误,需要我们很好的进行研究出错 ...
- springboot2.0入门(五)--swagger2接口API构建
一.特点 代码变,文档变.只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,很好的保证了文档的时效性. 跨语言性,支持 40 多种语言. Swagger UI 呈现出来的是一份可 ...
- Flask 安装 快速入门
$ pip install flask Flask自带的Server在端口5000上监听: ython app.py flask通过request.form['name']来获取表单的内容. 外部可见 ...
- c# 后台调用接口接收传过来的json
public string GetRequestTest(string url) { HttpWebRequest httpWebRequest = (HttpWebRequest)WebReques ...
随机推荐
- Collation 差异导致 KingbaseES 与 Oracle 查询结果不同
问题引入 前端提了个问题,说是KingbaseES 返回的结果与 Oracle 返回的结果不一样.具体问题如下: oracle 执行结果:oracle 有结果返回. SQL> create ta ...
- 初学 FSMC - 扩展外部SRAM(一)
1. SRAM控制原理 STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了. STM32F ...
- #欧拉回路,状压dp,Floyd#洛谷 6085 [JSOI2013]吃货 JYY
题目传送门 分析 先用Floyd求出两点间的最短距离,包含必经边的欧拉回路, 先考虑欧拉回路的性质就是度数为偶数且连通,那如果有偶数个奇点可以两两配对. 设 \(g[S]\) 表示选择 \(S\) 中 ...
- #状压dp#洛谷 3959 [NOIP2017 提高组] 宝藏
题目 选定一个起点 \(S\),找到一棵生成树,最小化 \[\sum_{i=1}^n dep_i\times dis_i \] \(n\leq 12\) 分析 设 \(dp[d][S]\) 表示当前树 ...
- 一文弄懂String的所有小秘密
目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 简介 String是java中非常常用的一个对象类型.可以说java中使用最多的就是String了.那 ...
- 【开源三方库】crypto-js加密算法库的使用方法
OpenAtom OpenHarmony(简称"OpenHarmony")三方库,是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开发OpenHa ...
- 战码先锋直播预告丨参与文档贡献,开启OpenHarmony社区贡献之旅
OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」(本期OpenHarmony开源贡献者计划以 ...
- SQL 算术运算符:加法、减法、乘法、除法和取模的用法
SQL Server中的存储过程 什么是存储过程? 存储过程是一段预先编写好的 SQL 代码,可以保存在数据库中以供反复使用.它允许将一系列 SQL 语句组合成一个逻辑单元,并为其分配一个名称,以便在 ...
- redis 简单整理——复制的原理[二十三]
前言 简单介绍一下复制的原理. 正文 在从节点执行slaveof命令后,复制过程便开始运作,下面详细介绍建立 复制的完整流程. 1)保存主节点(master)信息. 执行slaveof后从节点只保存主 ...
- 重走py 之路 ——列表(一)
前言 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>>这本书的时候觉得对有基础的有很多的赘余,打算 ...