备注:URL全称-统一资源定位符

1、URL与函数的映射

一个简单的列子:定义了两个装饰器

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/")
  4. def hello_world():
  5. return "hello world"
  6. @app.route("/liu/")
  7. def liulang():
  8. return "最是人间留不住,朱颜辞镜花辞树"
  9. if __name__ == "__main__":
  10. app.debug = True
  11. app.run()

执行结果:页面输入” http://127.0.0.1:5000/
image.png
执行结果:页面输入” http://127.0.0.1:5000/liu
image.png
所谓映射就是:当你访问” http://127.0.0.1:5000/liu “(相当于x)时会自动执行其所对应的代码块(相当与与x对应的y值)
用数学中的说法就是:一个x值只能对应一个y值,但是一个y值却可以对应多个x值

2、URL实现ID输入

指定URL的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL,文章详情的URL是/article/id/,id有可能为1、2、3…,那么可以通过以下方式

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/")
  4. def hello_world():
  5. return "hello world"
  6. @app.route("/liu")
  7. def liulang():
  8. return "最是人间留不住,朱颜辞镜花辞树"
  9. @app.route("/liu/<aid>/") # 可以@app.route("/liu/<aid>")省去最后的/,但是不建议
  10. def tic_list(aid):
  11. return f"这是{aid}篇文章"
  12. if __name__ == "__main__":
  13. app.debug = True
  14. app.run()

返回结果:
image.png

注意:尖括号是固定写法,相对应的语法见3、指定数据类型输入,语法为converter(类型名称) : variable(变量)

3、指定数据类型输入

variable默认的数据类型是字符串。如果需要指定类型,则要写成converter(类型名称) : variable(变量),其中converter就是类型名称,可以有以下几种

  1. # string: 默认的数据类型,接受没有任何斜杠/的字符串。
  2. # int: 整形
  3. # float: 浮点型。
  4. # path: 和string类似,但是可以传递斜杠/。
  5. # uuid: uuid类型的字符串。
  6. # any:可以指定多种路径
  7. # 实现tic_list(aid)只能输入int型
  8. @app.route("/liu/<int:aid>/")
  9. def tic_list(aid):
  10. return f"这是{aid}篇文章"

修改之前输入:” http://127.0.0.1:5000/liu/abc/
image.png
修改成之后输入:” http://127.0.0.1:5000/liu/abc/
image.png
想要实现指定类型只要更改converter(类型名称)就可以了
小例子:指定多路径输入

  1. @app.route("/<any(aaa,bbb):url_path>/") # 后面的/不能漏掉
  2. def url_path(url_path):
  3. return f"访问的部分url为:{url_path}"

输入:” http://127.0.0.1:5000/aaa/
image.png
输入:” http://127.0.0.1:5000/bbb/
image.png

4、指定请求方法

实现” http://127.0.0.1:5000/nb/?name=liulangzhe “这种形式的输入(get请求)

  1. from flask import Flask
  2. from flask import request # 第一步:导入模块
  3. app = Flask(__name__)
  4. @app.route("/")
  5. def hello_world():
  6. return "hello world"
  7. @app.route("/liu/")
  8. def liulang():
  9. return "最是人间留不住,朱颜辞镜花辞树"
  10. @app.route("/liu/<int:aid>/")
  11. def tic_list(aid):
  12. return f"这是{aid}篇文章"
  13. @app.route("/<any(aaa,bbb):url_path>/")
  14. def url_path(url_path):
  15. return f"访问的部分url为:{url_path}"
  16. # 问号参数的接收 # 第二步:写入代码
  17. @app.route("/nb/")
  18. def url_get():
  19. return request.args.get("name")
  20. if __name__ == "__main__":
  21. app.debug = True
  22. app.run()

输出结果:注意书写形式为 /nb/?name=xxx
image.png
如果对应的是post请求,则使用request.form.get(参数)来获取参数,同时设置methods参数
简单的区分get和post请求(get请求中参数直接暴露在URL中,并不安全。post请求由于需要登录发送账户以及密码,因此直接暴露会有风险,因此相关参数并不会直接显示在URL中)
post请求小例子

  1. from flask import Flask,request # 需要导入request方法
  2. app = Flask(__name__)
  3. @app.route("/keyword/", methods=["GET", "POST"]) # methods参数决定了能够通过哪种求情方式
  4. def keyword():
  5. print(request.form.get("mima"))
  6. return "输入登陆密码"
  7. # 在不写methods参数的情况下默认为GET请求,但是当输入了methods后请求方法就由列表中的内容决定了
  8. # 如:methods=["POST"]就只能采用POST求情,而无法使用GET请求
  9. if __name__ == "__main__":
  10. app.run(debug=True)

返回结果:
image.png

5、构造URL(url_for(“函数名”,[参数],[参数],…))

简单来说就是通过函数名来获取其对应的路由地址
url_for()函数接收两个及以上的参数,它接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。
1、关于用法的说明事例

  1. from flask import Flask, url_for # 这里需要导入url_for方法
  2. app = Flask(__name__)
  3. @app.route("/")
  4. def main_on():
  5. print(url_for("login", aid=3)) # url_for方法
  6. return "这是一个主程序的入口"
  7. @app.route("/login/<int:aid>/")
  8. def login_url(aid):
  9. return f"第{aid}章"
  10. if __name__ == "__main__":
  11. app.run(debug=True)

2、对应的相关注意点
1、url_for需要从flask中进行导入(import flask import url_for)
2、url_for的使用如果引入的函数有对应的参数,则需要将其原本的参数名跟上,如果漏写或者误写都会报错
3、url_for中如果写了多个参数,其中某些参数在函数中不存在,则会用?将不存在的参数连接

  1. @app.route("/")
  2. def main_on():
  3. print(url_for("login",aid=3, page=5 ,t=123)) # url_for方法,传入不存在的参数page=5
  4. return "这是一个主程序的入口"
  5. @app.route("/login/<int:aid>/")
  6. def login_url(aid):
  7. return f"第{aid}章"

只传入aid,返回值为/login/2/
传入aid, page 页面不报错,但是返回值为/login/2/?page=5(将其当成查询参数,post请求)
传入aid,page, t 返回值为/login/2/?page=5&t=123

3、使用url_for的好处
1、可以有效的避免硬编码将url地址写死的高额维护成本,因为往往url地址会不断改变,但是其对应的函数名 称并不会有频繁的变动
2、url_for自带转义功能会转义一些特殊字符和unicode字符串,防止出现歧义,如在传入”/“作为参数时,会 将其转义为”%2f”,这样可以有效的识别”/“是参数还是路由的分隔符

  1. @app.route("/")
  2. def main_on():
  3. return "这是一个主程序的入口"
  4. @app.route("/login/<int:aid>/")
  5. def login_url(aid):
  6. print(url_for("main_on", index='/')) # 传入参数"/"
  7. return f"第{aid}章"

返回值为:/?index=%2f 传入的”/“转义成了”%2f”

6、页面跳转以及重定向

页面跳转:就是点击页面发生跳转,就比如你在淘宝上看到宝贝,点击宝贝的页面,就会跳转到这个商品的购买介绍页面
重定向:分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
1、永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
2、暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
code参数:确定是永久性或是暂时性重定向code=302(默认)

  1. from flask import Flask, request, redirect
  2. app = Flask(__name__)
  3. @app.route("/personal/")
  4. def home():
  5. return "登陆界面"
  6. # 硬编码
  7. # @app.route("/home/")
  8. # def Password():
  9. # password = request.args.get("password")
  10. # if password:
  11. # return "检测通过"
  12. # else:
  13. # return redirect("/personal/") # 直接通过路由访问
  14. # url_for(url常改但函数不会经常变动)
  15. @app.route("/home/")
  16. def Password():
  17. password = request.args.get("password")
  18. if password:
  19. return "检测通过"
  20. else:
  21. return redirect(url_for("home")) # 通过url_for方法反向获得url
  22. if __name__ == "__main__":
  23. app.run(debug=True)

情况一:输入password
image.png
情况二:没有输入password,重定向至” http://127.0.0.1:5000/personal/
image.png

7、关于相应(Response)

视图函数中可以返回以下类型的值:
1、Response对象。
2、字符串。其实Flask是根据返回的字符串类型,重新创建一个werkzeug.wrappers.Response对象,Response将 该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。(字符串(return “关 于我们”)等同于Response(“关于我们”, status=200, mimetype=”text/html”))
3、元组。元组中格式是(response,status,headers)。response为一个字符串,status值是状态码,headers是一些 响应头。(如果是这种形式return (”关于我们”, “200”, “mime”)那么只会返回第一个”关于我们”|如果写成 return “关于我们”, “200”则正常返回)
4、如果不是以上三种类型。那么Flask会通过Response.force_type(rv,request.environ)转换为一个请求对象。

  1. from flask import Response,make_response
  2. app = Flask(__name__)
  3. @app.route("/about/")
  4. def about():
  5. # return "abc"
  6. # return {"name": "abc"}
  7. # return ("abc", "200")
  8. # return "abc", 200
  9. # return Response("abc", status=200, mimetype="text/html")
  10. return make_response("abc")
  11. if __name__ == "__main__":
  12. app.run(debug=True)