LINUX.ORG.RU

Python framework для REST в 2018

 , ,


0

6

Доброго времени суток.

Возвращаюсь в веб девелопмент спустя некоторого перерыва и тут встал вопрос.

JS либы безнадежно захватили фронтенд и от React/Angular никуда не деться. Как собственно и от REST.

Какой python фреймворк актуален сегодня для web приложений с массовым использованием RESTа?

Django прекрасен и я даже готов использовать его, но REST/json в нем до сих пор реализуется как сторонняя функциональность, а в свою очередь из коробки много ненужного. Staticfiles в текущих трендах почти потерял актуальность.

Смотрю в сторону Pyramid. Со временем pylons неплохо развивается и остаётся легковесным и модульным.

Придумали ли что-то лучше для rest приложений, которые легко интегрируются с react, webpack и прочей новомодной фигнёй?

P.S. nodejs для бекенда не предлагать. Пока не готов продать душу окончательно.

flask, aiohttp, pyramid, falcon, выбирай.

Deleted
()

falcon - создан для реста и очень быстрый (бытсрее фласка и джанги)

KernelPanic
()

Написал на фальконе модный микросервис из 30 строк. Рекомендую.

entefeed ☆☆☆
()

Какой python фреймворк актуален сегодня для web приложений с массовым использованием RESTа?

Django Rest Framework

q13
()
Ответ на: удаленный комментарий

Удваиваю. Растишку бери.

anonymous
()
Ответ на: удаленный комментарий

Уж лучше питон, чем $язык $с $такими $вот $объявлениями $переменных!

menangen ★★★★★
()
Ответ на: комментарий от menangen

aiohttp-то зачем?

Во-первых, асинхронный ввод-вывод не нужен в 99.9% случаев. Во-вторых, asyncio - само по себе гавёха похуже твистеда. Зачем его трогать вообще?

anonymous
()

nodejs для бекенда не предлагать. Пока не готов продать душу окончательно

Было бы за что продавать. Древний стагнирующий express.js и отвратная отвратная интеграция с внешним миром (прежде всего БД)

makoven ★★★★★
()
Ответ на: комментарий от menangen

И чем же это лучше? С таким вот вот объявлением $переменных не возникает проблем из-за пересечения с именами функций и служебных слов.

>>> range(1,3)
[1, 2]

>>> range = [1,10]

>>> range(1,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable


>>> def copy(from, to):
  File "<stdin>", line 1
    def copy(from, to):
                ^
SyntaxError: invalid syntax

ЛОЛ.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

В пределах модуля, в котором ты это натворил, range будет массивом. Что не так уж и страшно. Хотя, глобальные для модуля переменные принято писать прописными буквами.

А в контексте функции ничего страшного, если создашь переменную range, если глобальная range в теле функции не используется. Хотя линтер может и ругнется

makoven ★★★★★
()
Ответ на: комментарий от makoven

Что не так уж и страшно. Хотя, глобальные для модуля переменные принято писать прописными буквами

Каждый раз проигрываю от этого. Сначала питонисты говорят фи, что нужно писать $. Потом рассказывают про прописные буквы, подчёркивания и т.п. костыли. А чем это всё принципиально отличается от $foo? Может $ «не так уж и страшно»?

если глобальная range в теле функции не используется

То в функции не используется цикл c range. И такие нежданчики могут всплывать в самых разных местах, особенно с from CoolLib import *

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

За 6 лет с питоном НИ РАЗУ у меня не было пересечений со стандартной библиотекой. Были только пересечения с наименованиями модулей, но не с переменными)

menangen ★★★★★
()
Ответ на: комментарий от menangen

За 6 лет с питоном НИ РАЗУ у меня не было пересечений со стандартной библиотекой

Конечно были, но ты их избегал. Ты сознательно не используешь идентификаторы с такими именами которые могут привести к проблемам, или не работают. Просто привык и не замечаешь, насколько это ущербно.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Потом рассказывают про прописные буквы, подчёркивания и т.п. костыли

Не костыли, а соглашения. Для себя можешь как хочешь писать. А если это пуллреквест в какую-нибудь либу или твой открытый проект, то со своим глобальным range прослывешь дурачком:)

Может $ «не так уж и страшно»?

Ну да. А что тут страшного

То в функции не используется цикл c range

Если ты в теле функции объявляешь переменную, а затем используешь ее в цикле, то ты, видимо, знаешь что делаешь. Если же у тебя функции такие, что в экран не влезают, то, опять же, ты странный тип :)

makoven ★★★★★
()
Ответ на: комментарий от commagray

Очень странные товарищи (или я чего-то не догоняю)

Зачем-то реализовали днищенский API flask'а. Как следствие, появился костыль, прячущий это API за современным фасадом

В зависимостях у них зачем-то прописаны uvloop и ujson (хотя sanic может работать и без них). Причем прописаны как-то криво, отчего вместо готовых wheel-ов качаются исходники и компилятся на твоей машине. Установка вылетает с ошибкой. О чем разработчикам неоднократно тыкали мордой, но они, похоже, упороты

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Ты сознательно не используешь идентификаторы с такими именами которые могут привести к проблемам, или не работают

Каков подлец, а!

Im_not_a_robot ★★★★★
()
Ответ на: комментарий от makoven

Для себя можешь как хочешь писать

Ну я хочу писать def copy(from, to), и это не работает.

Если ты в теле функции объявляешь переменную, а затем используешь ее в цикле, то ты, видимо, знаешь что делаешь

Ага, def walk_list(list, range, callback) и опять проблемы.

Не костыли, а соглашения

Я не против. Просто на мой вкус это архаика.

Ну да. А что тут страшного

Не знаю, зачем отдельные граждане постоянно теребят этот $. Ведь он позволяет как раз писать $count = count($array). В питоне же даже простое list = [1,2,3] - потенциальная проблема.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Для пирамиды для rest есть cornice, но я бы на ней для себя не писал (основной по работе фреймворк на протяжении 2-х лет). Есть django-rest-framework или можно навелосипедить своё на aiohttp.

AlexKiriukha ★★★★
()
Ответ на: комментарий от no-such-file

В питоне же даже простое list = [1,2,3] - потенциальная проблема.

Ты пишешь конструкции вида #define true false и жалуешься что язык их криво обрабатывает...

Это пример эталонного говнокода и любой синтаксический анализатор тебе такую хрень отловит за 5 минут.

Я не против. Просто на мой вкус это архаика.

Ну, суть кода на Питоне - код должен быть красив. Ровным столбиком 80 символов без регистров в переменных пишите на других языках.

Scondo
()
Ответ на: комментарий от Scondo

Ты пишешь конструкции вида #define true false и жалуешься что язык их криво обрабатывает

Я не жалуюсь, я просто говорю, что язык кривой потому, что он не защищает от таких конструкций. К слову сказать, #define это не часть языка, а препроцессор - отдельный язык. И да он тоже кривой, всем известно сколько там костылей и сколько проблем это создаёт.

Это пример эталонного говнокода

Называть переменные естественными именами, вроде list - это говнокод? Ну-ну. Я бы сказал, что это говноязык, если на нём опасно так писать.

Ну, суть кода на Питоне - код должен быть красив

А я думал, что код должен работать. Ну ладно.

no-such-file ★★★★★
()

2018
Писать код на динамических языках.

/0

RazrFalcon ★★★★★
()
Ответ на: удаленный комментарий

Это удобно и быстро.

Эдик, покажи аналог:

#![feature(plugin)]
#![plugin(rocket_codegen)]

extern crate rocket;

#[get("/hello/<name>/<age>")]
fn hello(name: String, age: u8) -> String {
    format!("Hello, {} year old named {}!", age, name)
}

fn main() {
    rocket::ignite().mount("/", routes![hello]).launch();
}
на сишке.

RazrFalcon ★★★★★
()
Ответ на: комментарий от no-such-file

Просто на мой вкус это архаика.

То есть 95% языков - это архаика, а PHP - это стильно/молодёжно?

Даже от ЛОРа я такого не ожидал.

RazrFalcon ★★★★★
()
Ответ на: комментарий от no-such-file

код должен быть красив
код должен работать
лиспер

Всё сходится.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ныне же actix-web модно.

extern crate actix_web;

use actix_web::{http, server, App, Path, Responder};

fn hello(info: Path<(String, u32)>) -> impl Responder {
    format!("Hello, {} year old named {}!", info.1, info.0)
}

fn main() {
    server::new(
        || App::new()
            .route("/hello/{name}/{age}", http::Method::GET, hello))
        .bind("127.0.0.1:8080").unwrap()
        .run();
}

И никакой магии.

anonymous
()
Ответ на: комментарий от RazrFalcon

То есть 95% языков - это архаика

Какая связь между отдельной проблемой и языком как таковым, что за максимализм? Есть конкретная проблема, которая в питоне решается дедовским методом, причём не самым лучшим. Мне просто смешно, когда кто-то пытается пристебаться к пыху по поводу $ при том, что этот $ принципиально решает то, что в питоне решено не лучшим образом.

Шта?

Та, а ты не знал?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Какая связь между отдельной проблемой и языком как таковым

Ваша претензия к питону не ограничивается питоном.

Есть конкретная проблема

Это не проблема.

Та, а ты не знал?

Главное чтобы авторы языка знали. А то они, судя по всему, не в курсе.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

actix ещё не тыкал.

И никакой магии.

Там акторы, что уже нетривиально.

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от no-such-file

В питоне же даже простое list = [1,2,3]

ССЗБ. Это у тебя не list, а numbers. И walk_list подозрительно низкоуровневое название. Ты пишешь либу для работы со стандартными питоновскими типами? Я бы понял menu.walk_items() или даже walk_files(directory)

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

Ваша претензия к питону не ограничивается питоном

Моя претензия вообще не к питону. А к свидетелям святого Гвидо.

Это не проблема

Тут должна быть картинка со страусиной позой.

А то они, судя по всему, не в курсе

Они-то как раз в курсе и нигде не утверждали что #define валидное выражение на языке Cи. Это часть среды трансляции, а не часть языка.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Ну я хочу писать def copy(from, to), и это не работает

А почему у меня работает?

# temp.py
def copy():
    print('Rabotaet')

copy()
~$ python temp.py 
Rabotaet
~$ python3 temp.py 
Rabotaet
makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

ССЗБ. Это у тебя не лист, а numbers

Это у меня пример. Если я пишу list = [1, «a»] то numbers уже не подходит. Но я понимаю конечно, что вместо list можно использовать другое имя. Проблема в том, что мне нужно об этом заморачиваться, вместо того чтобы использовать естественные названия.

И walk_list подозрительно низкоуровневое название

Это обычное название, вполне естественное.

Я бы понял walk_files(directory)

А list = walk_files(directory, range) ты бы понял? Или menu.walk_items(range)? На самом деле, учитывая особенность циклов в питоне range прямо-таки напрашивается на имя переменной для задания диапазона.

А почему у меня работает?

Потому что ты кретин и не смог даже скопипастить пример? Или ты так прикалываешься?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Они-то как раз в курсе и нигде не утверждали что #define валидное выражение на языке Cи.

Почему тогда это часть спецификации языка?

RazrFalcon ★★★★★
()
Ответ на: комментарий от no-such-file

А к свидетелям святого Гвидо.

А он тут при чём? Такое же поведение будет в тонне других языков.

RazrFalcon ★★★★★
()
Ответ на: комментарий от no-such-file

Если я приведу пример list = [1, «a»] то numbers уже не подходит

Все-таки пишешь либу для работы со стандартными питоновскими типами. DDD? Нет, не слышал

На самом деле, учитывая особенность циклов в питоне range прямо-таки напрашивается на имя переменной для задания диапазона

Ну если так чешется то почему бы и нет:

def walk_list(list, range):
    print(list[range[0]:range[1]])

walk_list([1,2,3,4,5], (2, 4))

Потому что ты кретин

А, ты про ключевое слово «from»? Красава, чо. Хорошо хоть до «if» не д***ался

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от no-such-file

PS: совсем упоротые могут сколько угодно чудить и все-равно иметь доступ к встроенным функциям:

import builtins
range = (1,2)
for i in builtins.range(10):
  pass
makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

Все-таки пишешь либу для работы со стандартными питоновскими типами

Ты правда такой тугодум, что не можешь вообразить другого применения абстрактных названий? Ну ок, подскажу MySuperRemoteApi.walk_list(list, range).

def walk_list(list, range):
    print(list[range[0]:range[1]])
def walk_list(list, range):
    print(list(list[range[0]:range[1]]))

Уже не так весело.

про ключевое слово «from»? Красава, чо. Хорошо хоть до «if» не д***ался

В том числе. ИМХО очень удобно когда имя переменной может быть произвольным и не нужно заморачиваться тем, что оно совпадает с каким-то служебным словом.

И да, делать from служебным словом было не очень умно. Всё таки слово достаточно ходовое. Да и вообще вся эта from .. import выглядит сомнительной затеей. Ну это уже другая тема.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.