Вопрос по python, frameworks, flask – Сегмент с несколькими URL во Flask и другие фреймы Python

4

Я создаю приложение как в «Бутылке», так и во «Фляске», чтобы увидеть, что мне удобнее, так как в Django слишком много «батарей».

Я прочитал документацию по маршрутизации, которая очень ясна и понятна, но я изо всех сил пытаюсь найти способ справиться с неизвестным, возможно, неограниченным количеством сегментов URL. то есть:

http://www.example.com/seg1/seg2/seg3/seg4/seg5.....

Я смотрел на использование чего-то вроде

@app.route(/< path:fullurl >)
 использование регулярных выражений для удаления нежелательных символов и разбиение строки fullurl на список такой же длины, что и количество сегментов, но это кажется невероятно неэффективным.

Кажется, что в большинстве фреймворков PHP есть метод построения массива имен переменных сегмента независимо от их числа, но ни Flask, Bottle или Django, похоже, не имеют аналогичной опции, мне кажется, нужно указать точное количество сегментов для захвата переменных. Кажется, что пара PHP-cms сразу собирает первые 9 сегментов как переменные, и все, что больше, передается как полный путь, который затем разбивается так, как я упоминал выше.

Я не понимаю, как все работает в маршрутизации URL? Является ли метод разделения строк действительно неэффективным или лучший способ сделать это? Или есть способ собрать неизвестное количество сегментов прямо в переменные в Flask?

Я довольно новичок в фреймворках Python, так что объяснения пятилетних помогут,

большое спасибо.

Ваш Ответ

3   ответа
4

Разделение строки не приводит к неэффективности вашей программы. С точки зрения производительности это незначительное дополнение к обработке URL, выполняемой платформой. Это также вписывается в одну строку кода.

@app.route('/<path:fullurl>')
def my_view(fullurl):
    params = fullurl.split('/')
Спасибо за советы по производительности, сайт, который я создаю в настоящее время, имеет мало посетителей в целом, но два раза в месяц он посещает несколько тысяч посетителей менее чем за час, поэтому время отклика страницы очень важно для этого периода.
Предлагаемое решение - путь. Вы также можете определить пользовательский конвертер, если обработка будет более сложной, и вы будете использовать ее в нескольких местах. Документация для этого здесь:flask.pocoo.org/docs/0.12/api/#url-route-registrations
13

Я сам новичок во Flask, но из того, что я до сих пор разрабатывал, я почти уверен, что идея в том, что у вас есть много маленьких методов просмотра маршрута / вида, а не один огромный сильный зверь переключения.

Например, если у вас есть такие URL:

http://example.com/unit/57/
http://example.com/unit/57/page/23/
http://example.com/unit/57/page/23/edit

Вы бы направили это так:

@app.route('/unit/<int:unit_number>/')
def display_unit(unit_number):
    ...

@app.route('/unit/<int:unit_number>/page/<int:page_number>/')
def display_page(unit_number, page_number):
    ...

@app.route('/unit/<int:unit_number>/page/<int:page_number>/edit')
def page_editor(unit_number, page_number):
    ...

Это помогает сохранить некоторую структуру в вашем приложении и полагаться на инфраструктуру для маршрутизации, а не на захват URL-адреса и выполнение всей маршрутизации самостоятельно. Затем вы можете также использовать чертежи для работы с различными функциями.

Я признаю, хотя, я изо всех сил пытаюсь придумать ситуацию, когда вам понадобится неограниченное количество разделов в URL?

Я смотрел на несколько систем CMS, которые перечисляют неограниченные сегменты в своих функциях, поскольку сайт, который я создаю, достигает 11 сегментов. Я также хочу повторно использовать базовую систему для других проектов и хотел убедиться, что я встал на правильную ногу. Сейчас я собираюсь немного реструктурировать сайт, и благодаря вашему совету я буду использовать многоуровневые декораторы Flask с несколькими обработчиками / диспетчерами страниц.
+1 - вы на месте.
1

это работает & # xFF1A;

@app.route("/login/<user>/<password>")
def login(user, password):
    app.logger.error('An error occurred')
    app.logger.error(password)
    return "user : %s password : %s" % (user, password)

затем:

http://example.com:5000/login/jack/hi

выход:

user : jack password : hi

Похожие вопросы