来源丨公众号-菜J学Python:Web开发 | 路由、变量规则与响应体详解 链接丨https://mp.weixin.qq.com/s/OKCtZN8AqoIrwKinAbSWZA

一般我们设置web应用程序的URL,需要设置有意义的URL来帮助用户记忆。比如说,登录界面的URL可以设置为/login,而登出界面的URL可以设置为/logout。而不是设置一堆没有任何意义的字符串,那样只会恶心用户。

使用route装饰器将功能绑定到URL中。

  1. @app.route('/')
  2. def index():
  3. return 'Index Page'
  4. @app.route('/hello')
  5. def hello():
  6. return 'Hello, World'

可以做更多,使部分URL动态化,并将多个规则附加到一个函数上。

大家还需要知道一个内容就是路由函数与装饰器

01 路由

  1. from flask import Flask
  2. # 路由函数:add_url_rule与装饰器
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def hello():
  6. return 'Hello world'
  7. def index():
  8. return 'hello everyone'
  9. # 通过add_url_rule这个函数将我们要访问的路径告诉服务器,那么服务器就会跳转到指定页面。
  10. app.add_url_rule('/index', view_func=index)
  11. if __name__ == '__main__':
  12. app.run()

02 变量规则

我们可以使用变量标记各个部分,将动态部分添加到URL中,标记使用的是<>(一对尖括号)。

  1. from flask import Flask
  2. app = Flask(__name__)
  3. data = {'a': '北京', 'b': '上海', 'c': '广州', 'd': '深圳'}
  4. # 除了字符串默认是str类型,其他整型、浮点型等都需要标记int和float。
  5. # 要注意返回的值只能是字符串。
  6. @app.route('/getcity/<key>')
  7. def getcity(key):
  8. return data.get(key, '走丢了')
  9. @app.route('/add/<int:num>')
  10. def add(num):
  11. result = str(num + 10)
  12. return result
  13. @app.route('/path/<path:subpath>')
  14. def get_path(subpath):
  15. return subpath
  16. @app.route('/uuid/<uuid:my_uuid>')
  17. def get_uuid(my_uuid):
  18. return f'得到的uuid:{my_uuid}'
  19. if __name__ == '__main__':
  20. app.run()

2.1 path

在上面的代码中你会发现有一个path类型的标记。那什么时候需要用到呢?
当后面的路径是一种动态变化的,那我们就可以通过这种方式来获取变化的URL。

2.2 uuid

uuid是一种通用的唯一识别码的缩写,是一种软件构建的标准,在这样的情况下,就不需要考虑数据库创建时名称重复的问题。
uuid是一个128bit的数值,这个数值可以通过一定的算法计算出来。uuid用来识别属性类型,在所有空间和时间上被视为唯一标识。
uuid的一般格式为xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx(8-4-4-12)。
同时,我们可以使用Python来生成uuid格式的数据

  1. import uuid
  2. uid = uuid.uuid4()
  3. print(uid)

除了字符串和数字类型的数据,其他数据类型使用的比较少。

03 /的重要性

  1. 以下两个规则的不同之处在于是否使用尾部斜杠
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/project/')
  5. def projects():
  6. return 'The project page'
  7. @app.route('/about')
  8. def about():
  9. return 'The about page'
  10. if __name__ == '__main__':
  11. app.run()

上面的代码中有两个路径,第一个为/project/,第二个路径为/about。

第一个路径的尾部是加了一条斜杠,而第二个路径的尾部是没有加斜杠的。

当访问:http://localhost:5000/project/,返回的值肯定是The project page
当访问:http://localhost:5000/project,会进行页面的跳转,然后再访问:http://localhost:5000/project/

project的URL是中规中矩的,尾部有一个斜杠,看起来就像一个文件夹。访问一个没有斜杠的URL结尾时,Flask会自动进行重定向,并在尾部加上一个斜杠。
about的URL尾部没有斜杠,因此其行为表现与文件类似,如果访问URL添加斜杠就会得到一个404错误。这样可以保持URL唯一,并帮助搜索引擎避免重复索引同一个页面。

04 Response对象

4.1 返回普通的字符串

4.2 json数据

4.3 返回元组

4.4 获取该对象的基本信息

  1. from flask import Flask, Response, jsonify
  2. import json
  3. app = Flask(__name__)
  4. # 4.1 返回普通的字符串
  5. # flask视图函数的return可以不做转化的返回:字符串
  6. @app.route('/41')
  7. def index():
  8. return 'Hello World'
  9. # 其实上面的返回是默认使用Response转换过来的,它和下面代码是一样的。
  10. @app.route('/412')
  11. def index2():
  12. return Response('Hello World')
  13. # 4.2 json数据
  14. # 如果你想要返回列表,字典之类的数据,就需要先转换为json数据返回。
  15. @app.route('/42')
  16. def index3():
  17. dict_data = {
  18. 'name': '啃书君',
  19. 'age': 20
  20. }
  21. return jsonify(dict_data)
  22. # 4.3 返回元组
  23. # 返回元组是有要求的,元组内容包括三个参数,response(响应体)、status_code(状态码,可以自定义)、headers(响应头)
  24. # 在这里headers是可以不写的,系统有默认的响应头。
  25. @app.route('/43')
  26. def user():
  27. json_dict = {
  28. 'name': '啃书君',
  29. 'user_info': {'age': 20}
  30. }
  31. data = json.dumps(json_dict)
  32. return data, 200, {"ContentType": "application/json"}
  33. # 4.4 获取该对象的基本信息
  34. @app.route('/index')
  35. def index4():
  36. response = Response('<h1>大家好,今天中午吃什么</h1>')
  37. print(response.content_type)
  38. print(response.headers)
  39. print(response.status_code)
  40. print(response.status)
  41. return response
  42. if __name__ == '__main__':
  43. app.run()