Как бы вы оценили этот код на Python? (Джанго Аякс)


Этот код приходит прямо из примера код в книге Джанго. Я нахожу это весьма плохо, в основном потому, что использование флагов (если Аякс снова , если "Аякс") и излишне большую область видимости переменной (задается название=", теги=" и затем использовать эти переменные в разных потоках). Тело функции также, кажется, слишком долго.
Я думаю, я буду вычитать название книги (для записи я найти книгу в целом хорошо).

Как бы вы оценили этот код, скажем из 10 (10=очень хорошо, 3 и ниже, что неприемлемо)? (Я бы оценил его 3)

Почему я спрашиваю, я отверг подобный код в прошлом во время код-ревью и теперь я задаюсь вопросом, то ли я слишком строгая или не понял питон культуры (я новичок в Python).

@login_required
def bookmark_save_page(request):
  ajax = 'ajax' in request.GET
  if request.method == 'POST':
    form = BookmarkSaveForm(request.POST)
    if form.is_valid():
      bookmark = _bookmark_save(request, form)
      if ajax:
        variables = RequestContext(request, {
          'bookmarks': [bookmark],
          'show_edit': True,
          'show_tags': True
        })
        return render_to_response(
          'bookmark_list.html', variables
        )
      else:
        return HttpResponseRedirect(
          '/user/%s/' % request.user.username
        )
    else:
      if ajax:
        return HttpResponse(u'failure')
  elif 'url' in request.GET:
    url = request.GET['url']
    title = ''
    tags = ''
    try:
      link = Link.objects.get(url=url)
      bookmark = Bookmark.objects.get(
        link=link,
        user=request.user
      )
      title = bookmark.title
      tags = ' '.join(
        tag.name for tag in bookmark.tag_set.all()
      )
    except (Link.DoesNotExist, Bookmark.DoesNotExist):
      pass
    form = BookmarkSaveForm({
      'url': url,
      'title': title,
      'tags': tags
    })
  else:
    form = BookmarkSaveForm()
  variables = RequestContext(request, {
    'form': form
  })
  if ajax:
    return render_to_response(
      'bookmark_save_form.html',
      variables
    )
  else:
    return render_to_response(
      'bookmark_save.html',
      variables
    )


721
5
задан 31 мая 2011 в 01:05 Источник Поделиться
Комментарии
1 ответ

На мой взгляд, это немного трудно читать. Вы должны разбить его на POST/GET методы.
Затем вы должны очистить код в POST/GET методы.
Что-то вроде этого, например.

@login_required
def bookmark_save(request):
form = BookmarkSaveForm()
if request.method == 'POST':
form = bookmark_POST(request):
if isinstance(form, HttpResponse):
return form
elif 'url' in request.GET:
form = bookmark_GET(request)

variables = RequestContext(request, {'form': form})

if 'ajax' in request.GET:
template_name = 'bookmark_save_form.html'
else:
temaplte_name = 'bookmark_save.html'
return render_to_response(temaplte_name, variables)

И функции для POST/GET действиях

def bookmark_POST(request):
form = BookmarkSaveForm(request.POST)
if form.is_valid():
bookmark = _bookmark_save(request, form)
if 'ajax' in request.GET:
variables = RequestContext(request, {
'bookmarks': [bookmark],
'show_edit': True,
'show_tags': True
})
return render_to_response(
'bookmark_list.html', variables
)
else:
return HttpResponseRedirect(
'/user/%s/' % request.user.username
)
else:
if 'ajax' in request.GET:
return HttpResponse(u'failure')
return form

def bookmark_GET(request):
url = request.GET['url']
try:
link = Link.objects.get(url=url)
bookmark = Bookmark.objects.get(
link=link,
user=request.user
)
title = bookmark.title
tags = ' '.join(
bookmark.tag_set.all().\
values_list('name', flat=True)
)
except (Link.DoesNotExist, Bookmark.DoesNotExist):
title = ''
tags = ''
form = BookmarkSaveForm({
'url': url,
'title': title,
'tags': tags
})
return form

6
ответ дан 31 мая 2011 в 04:05 Источник Поделиться