13 нояб. 2013 г.

Разработчики Python VS Django

Во многих компаниях давно использующих python недолюбливают django. Раньше мне было не вполне понятно почему. Я считал это снобизмом. Теперь уверился, что джуниоры, начинающие свой практический путь с использования только фреймворков теряют потенцию искать решение самостоятельно. Первое, что они делают, когда сталкиваются с проблемой - гуглят готовое решение или желательно сразу батарейку. Если удалось найти решение сразу на стэковерфлоу - это победа. Скорей всего, люди писавшие ответ уже подумали, а значит нам думать и вовсе не нужно.Если ошибочное мнение повторено еще и в чьем-нибудь бложике, так вообще здорово. Ты на верном пути, будущий Лайнус Торвальдс. Проблемы начинаются потом. Решение нужно масштабировать/поддерживать/развивать, а понимания того, как оно работает нет.

Порой доходит до совсем смешного. Предположим некое API, в одном из методов принимает два POST параметра, для которых по сути не нужны ни валидаторы диапазона, ни проверка ввода. Как это правильно делать с точки зрения Django? Надо написать форму!

class DjangoForm(forms.Form):
    param1 = forms.CharField(required=False)
    param2 = forms.CharField(required=False)


def testFormView(request):
    form = DjangoForm(request.POST)
    if form.is_valid():
        param1 = form.cleaned_data['param1']
        param2 = form.cleaned_data['param2'] 

Но в рамках того же проекта на django можно просто обработать POST-параметры:
def testPOSTView(request):
    if request.method == 'POST':
        param1 = request.POST.get('param1')
        param2 = request.POST.get('param2') 

Возьмем для простоты улучшенный RequestFactory из https://djangosnippets.org/snippets/2231/ и напишем простяцкий тест:
request = RequestFactory().post('/submit/', {'param1': 'value1', 'param2': 'value2'})


def timeit(func, times):
    start = time.time()
    for i in range(0, times):
        func(request)
    return time.time() - start


def main():
    print timeit(testFormView, 10000)
    print timeit(testPOSTView, 10000)

Результат этого теста 1.77991509438 против 0.0828511714935.
Отправить комментарий