<p>似乎您应该考虑使用注释,而不仅仅是函数:</p>
<pre><code>def guest_constraint(fn):
def _inner_guest_constraint(request)
# This part should be familiar
try:
guest = GuestProfile.objects.get(user=request.user.id)
except ObjectDoesNotExist:
return render(request, 'extGuest/appGuestError/not_hotel_login.html')
try:
room_information = RoomInformation.objects.get(guest_token=guest.token)
except ObjectDoesNotExist:
return render(request, 'extGuest/appGuestError/constraint_error.html')
# Call the wrapped function
fn(request)
# return the wrapping
return _inner_guest_constraint
</code></pre>
<p>然后你可以简单地注释:</p>
<pre><code>@login_required
@guest_constraint
def index(request):
</code></pre>
<p>也可以对其进行修改,以便包装函数添加参数:</p>
<pre><code>def guest_constraint(fn):
def _inner_guest_constraint(*args,**kwargs):
# stuff
kwargs.update({'guest':guest, 'room_info': room_information})
fn(*args,**kwargs)
return _inner_guest_constraint
</code></pre>
<p>这意味着您需要确保注释视图采用guest和room_info参数,但也意味着您只需定义一次变量。你知道吗</p>