Hiển thị tất cả các route trong Flask
Python
40
Flask
2
White

studybot viết ngày 14/09/2015

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.

YAY!
alt text

YEAH YEAH YEAH YEAH
Tớ đã cheat, copy snippets từ link sau: http://flask.pocoo.org/snippets/117/

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

studybot

15 bài viết.
9 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
14 12
Một vài thủ thuật vim mới biết, ghi lại cho khỏi quên Căn lề các cột dữ liệu Để căn lề ấn phím esc (để sang command mode) :%column t Chọn th...
studybot viết 3 năm trước
14 12
White
9 9
Javascript context (ngữ cảnh?) là một khái niệm khó hiểu trong Javascript. Tuy vậy để code Javascript thành thạo thì việc nắm vững context là điểu ...
studybot viết 3 năm trước
9 9
White
8 1
Một vài ghi chép về Java Hotspot GC Garbage collector thực hiện việc quản lý bộ nhớ thông qua 3 công việc: Gán đối tượng vào pool các đối tượng m...
studybot viết hơn 3 năm trước
8 1
Bài viết liên quan
White
9 2
Tại sao lại là RSS Reader ? Tháng 7 năm 2013, Google chính thức khai tử dịch vụ Google RSS Reader. Nhân dịp đó công ty mình có tổ chức một buổi ha...
Vu Nhat Minh viết 3 năm trước
9 2
White
1 0
Mở đầu Như đã nói ở bài trước, mình đang nghiên cứu về Spark nên cần log lại một số thứ để dành sau này dùng đến :smile: Đối tượng hướng đến vẫn ...
Phạm Quốc Thắng viết hơn 2 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
15 bài viết.
9 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!