在flask中,可以使用在路由装饰器中使用methods=【访问方式】,同一视图中可以同时存在多种访问方式
# 通过methods限定访问方式
@app.route("/post_only",methods=["POST","GET"])
def post_only():
return "post_only"
if __name__ == '__main__':
print app.url_map
app.run(debug=True)
同名的URL可以有不同的访问方式
# 同样URL下和django一样,同名url不同访问方式。
@app.route("/hello",methods=["POST"])
def hello():
return "hello 1"
@app.route("/hello",methods=["GET "])
def hello2():
return "hello 2"
同一视图中可以有多种访问方式,使用if进行判断区分
if request.method == "GET":
pass
elif request.method == "POST":
pass
使用url_for 的函数,通过视图的名字找到视图对应的url路径
# coding:utf-8
from flask import Flask,current_app,redirect,url_for
# 创建FLask的应用对象
# __name__ 表示当前模块的名字
# 模块名,Falsk这个模块所在的位置为总目录,默认这个目录中static为静态目录, 为模版目录。
app = Flask(__name__)
@app.route("/login")
def login():
# url = "/"
# 使用url_for 的函数,通过视图的名字找到视图对应的url路径
url = url_for("index")
return redirect(url)
if __name__ == '__main__':
print app.url_map
app.run(debug=True)
Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6F1y1tS-1587388816775)(/Users/zhaobei/Library/Application Support/typora-user-images/image-20200420204253279.png)]
request中包含了前端发送过来的请求参数,request.from可以直接提取请求体中的表单格式数据,是一个类似字典的对象。
# coding:utf-8
from flask import Flask,request
app = Flask(__name__)
# 127.0.0.1:5000/index?city=shenzhen&country=china 查询字符串 Querystring
@app.route("/index",methods=["GET","POST"])
def index():
# request 中包含了前端发送过来的所有请求数据
# request.from可以直接提取请求体中的表单格式数据,是一个类似字典的对象
name = request.form.get("name")
age = request.form.get("age")
city = request.args.get("city")
print request.data
name_li = request.form.getlist("name")
print name_li[1]
return "hello name=%s,age=%s,city=%s"%(name,age,city)
if __name__ == '__main__':
app.run(debug=True)
已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,但它还有一个 save() 方法,这个方法允许你把文件保存到服务器的文件系统上。这里是一个用它保存文件的例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNCj2l13-1587388816778)(file:Users/zhaobei/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_image001.jpg)]
如果你想知道上传前文件在客户端的文件名是什么,你可以访问 filename 属性。但请记住, 永远不要信任这个值,这个值是可以伪造的。如果你要把文件按客户端提供的文件名存储在服务器上,那么请把它传递给 Werkzeug 提供的 secure_filename() 函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Krjvzvpw-1587388816779)(file:Users/zhaobei/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_image001.jpg)]
# coding:utf-8
from flask import Flask,request
app = Flask(__name__)
# 127.0.0.1:5000/index?city=shenzhen&country=china 查询字符串 Querystring
@app.route("/upload",methods=["POST"])
def upload():
"""接受前端传送过来的文件"""
file_obj = request.files.get("pic")
if file_obj is None:
return "没有上传图片"
# 直接使用上传文件对象进行保存
file_obj.save("demo1.png")
return "上传成功"
if __name__ == '__main__':
app.run(debug=True)
abort()函数用于提前退出(Google翻译abort)一个请求,并用指定的错误码返回。
函数原型如下:
flask.abort(status, *args, **kwargs)
第一个status参数可以是一个状态码,比如,404,也可以是一个WSGI应用,必不可少!示例如下:
abort(404) # 404 Not Found
abort(Response(‘Hello World’)) # Response包装的一个WSGI应用
注意,状态码要出现在Flask定义的异常号列表(the list of exceptions)中,否则会引发内部服务器错误,比如,传递2XX、3XX就不可以的。
# coding:utf-8
from flask import Flask,request,abort,Response
app = Flask(__name__)
@app.route("/login",methods=["GET"])
def upload():
"""接受前端传送过来的文件"""
# name = request.form.get("name")
# pwd = request.form.get("pwd")
name = ""
pwd = ""
if name != "zhangsan" and pwd != "admin":
# 使用abort可以立即终止视图函数的执行
# 并可以返回给前端特定的信息
# 1、abort 中可传入特定的状态码信息
abort(404)
# 2、传入响应体信息
# resp = Response("login failed")
# abort(resp)
return "login success"
# 自定义错误信息处理方法
@app.errorhandler(404)
def handle_404(err):
"""自定义错误处理方法"""
# 这里返回的是前端看到的错误信息
return u"出现了404错误,错误信息:%s"%err
if __name__ == '__main__':
app.run(debug=True)
可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
# coding:utf-8
from flask import Flask,request,abort,Response,make_response
app = Flask(__name__)
@app.route("/index")
def index():
# 1、使用元祖自定义相应信息
# 响应体 状态码 响应头可用列表和字典都可以,响应体是按照顺序从前到后的,后面的可以省略
# return ("index page",400,[("name","zhaobei"),("age","22")])
# 自定义状态码含义,状态码与描述空格间隔
# return ("index page", "666 this a 666 status", [("name", "zhaobei"), ("age", "22")])
# 2、使用make_response 来构造响应信息
resp = make_response("indes page2")
resp.status = "999 this a 999 status" #设置状态码
resp.headers["name"] = "zhaobei" # 响应头
return resp
if __name__ == '__main__':
app.run(debug=True)
# coding=utf-8
from flask import Flask,jsonify
import json
app = Flask(__name__)
@app.route("/index")
def index():
# json就是字符串
data = {
"name": "python",
"age": 18
}
# json.dumps 将字典转换为json字符串
# json.loads 将json字符串转换为字典
# json_str = json.dumps(data)
# return json_str,200,{"Content-Type": "application/json"}
# jsonify帮转转换为json数据,并设置响应头Content-Type为application/json
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
# coding=utf-8
from flask import Flask,make_response,request
app = Flask(__name__)
@app.route("/set_cookie")
def set_cookie():
"""设置cookie"""
resp = make_response("success")
resp.set_cookie("name","zhaochaoqun")
resp.set_cookie("age","18",max_age=3600)
return resp
@app.route("/get_cookie")
def get_cookie():
"""获取cookie"""
cookie = request.cookies.get("name")
return ("cookie is %s")%cookie
@app.route("/delete_cookie")
def delete_cookie():
"""删除cookie"""
resp = make_response("del success")
resp.delete_cookie("name")
return resp
不积跬步无以至千里,不积小流无以成江海。