Hi everyone, I have a (technical) problem with middleware, and also I’d be grateful to hear some suggestions about the general workflow. Doubtless all of you are familiar with a topic as simple as POST handling, and maybe some of you have improvements over the usual Django approach.
So, I have a web application which (surprise!) has forms and is DB-driven.
When designing the backend I considered the Django standard pattern for
forms[1] and found it has problems such as coupling of unrelated things like
showing a view and processing a form, and also it doesn’t provide a simple
means of showing the same form in different places but having one POST
handler.
Instead I chose another approach:
1. Every POST goes to the current URL (<form action="" method="post">);
2. On the server side, the URL of a POST is disregarded. The appropriate
handler is chosen by the value of a special parameter (I called
it “submission”, <input type="hidden" name="submission" />);
3a. If processing is successful, an HTTP 302 redirect is issued to the same
URL;
3b. If not, form.errors are attached to the request object and the appropriate
view is called, which has the opportunity of presenting the same form once
more, specifying the errors.
To implement this I wrote a middleware class which is as simple as
class post_middleware(object):
def process_request(self, request):
if request.method != "POST":
return None
if "submission" not in request.POST:
return None
try:
# successful POST always ends with a redirect
return HttpResponseRedirect(do_submission(request))
except invalid_form, e:
request._dict_form_errors = dict_errors(e.form.errors)
return None
So, it tries to handle the submission, and if that fails with an invalid form
error, it returns None to let Django proceed with its usual procedure to find
the appropriate view, which will then display the form again, complete with
the erroneous input found in request.POST and the errors taken from the
request object.
The implementation has not, however, been entirely successful.
So far Django modularity has allowed me to replace entire components with my
own ones, or with 3rd party ones (like StringTemplate, which is superior to
Django template engine), and integration was seamless. But I got all kinds of
problems with this custom middleware. First of all, exceptions other than my
custom invalid_form are no longer handled by the yellow screen of
technical_500_response. Also, the transaction middleware no longer performs
rollback on exceptions.
So could anyone please tell me how do I make Django handle middleware
exceptions (do I have to wait until bug #6094 is fixed?), and also whether
there’s another approach to handling form submissions with the above benefits
and less drawbacks?
References:
[1] http://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-view
--
TIA
Roman.
smime.p7s
Description: S/MIME cryptographic signature

