Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Hiển thị tất cả các route trong Flask
Web Framework Flask định nghĩa route bằng annotations kiểu như
@route('/users/add', methods=['GET'])
def user_add():
pass
Lợi thế của cách làm này là route được định nghĩa rất tự do thoải mái, không cần phải để ý đến cấu hình v.v như rails. Người mới tiếp cận codebase đọc code cái biết ngay function này phục vụ cho URL path nào. Nhược điểm là route dễ bị phân tán, khó quản lý. Một điểm nữa là khi tách webapp ra thành nhiều Blueprint, thì path sẽ được định nghĩa ở nhiều file view khác nhau, rất khó quản lý và biết được một route bất kỳ được định nghĩa ở file nào.
Trong rails thì ta có thể dùng lệnh
$ bin/rake routes
Để liệt kê các route trong các file view - rất tiện. Đáng tiếc là Flask không hỗ trợ một chương trình kiểu như rake routes.
Tuy vậy, không hỗ trợ không có nghĩa là không thể thực hiện được. Ta có thể chế 1 chương trình giống rake routes
của rails trong Flask bằng các bước sau:
1. Cài Flask-Script
$ pip install Flask-Script
Collecting Flask-Script
...-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Downloading Flask-Script-2.0.5.tar.gz (42kB)
100% |████████████████████████████████| 45kB 5.6MB/s
Requirement already satisfied (use --upgrade to upgrade): Flask in ./env/lib/python2.7/site-packages (from Flask-Script)
Requirement already satisfied (use --upgrade to upgrade): itsdangerous>=0.21 in ./env/lib/python2.7/site-packages (from Flask->Flask-Script)
....
2. Viết 1 script nhỏ sử dụng manager script để show route
Đặt tên file la urls.py. myapp là ứng dụng muốn xem route. Cách làm là ta lấy tất cả các endpoint được định nghĩa trong app, dùng hàm url_for
có sẵn trong Flask để convert endpoint sang route.
from flask import url_for
from flask.ext.script import Manager
from myapp import app
manager = Manager(app)
@manager.command
def show():
import urllib
output = []
for rule in app.url_map.iter_rules():
options = {}
for arg in rule.arguments:
options[arg] = "[{0}]".format(arg)
methods = ','.join(rule.methods)
url = url_for(rule.endpoint, **options)
line = urllib.unquote("{:50s} {:20s} {}".format(rule.endpoint, methods, url))
output.append(line)
for line in sorted(output):
print line
if __name__ == '__main__':
manager.run()
3. Chạy chương trình
Chạy bằng cách
$ python urls.py show
Kết quả trả về giống như sau:
admin.applications HEAD,OPTIONS,GET /admin/applications
admin.logs_edit HEAD,OPTIONS,GET /admin/logs/edit
admin.logs_view HEAD,OPTIONS,GET /admin/logs/view
admin.users HEAD,OPTIONS,GET /admin/users/
admin.users_detail HEAD,OPTIONS,GET /admin/users/[username]
log.view HEAD,OPTIONS,GET /log/view
static HEAD,OPTIONS,GET /static/[filename]
user.login HEAD,POST,OPTIONS,GET /user/login/
user.register HEAD,POST,OPTIONS,GET /user/register/
Giờ ta có thể biết dễ dàng nơi định nghĩa các route cũng như các route truy cập webapp.
YEAH YEAH YEAH YEAH
Tớ đã cheat, copy snippets từ link sau: http://flask.pocoo.org/snippets/117/







