Skip to content

Commit

Permalink
Don't render 3xx responses
Browse files Browse the repository at this point in the history
  • Loading branch information
optilude committed Feb 26, 2010
1 parent 3a9b1bc commit d38079c
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ CHANGES
2.3.3 (unreleased)
------------------

- Don't invoke render() when publishing the form as a view if the HTTP status
code has been set to one in the 3xx range (e.g. a redirect or not-modified
response) - the response body will be ignored by the browser anyway.

- Handle Invalid exceptions from constraints and field validators.

- Don't create unnecessary self.items in update() method of
Expand Down
5 changes: 5 additions & 0 deletions src/z3c/form/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,11 @@ def update(self):

def __call__(self):
self.update()

# Don't render anything if we are doing a redirect
if self.request.response.getStatus() in (300, 301, 302, 303, 304, 305, 307,):
return u''

return self.render()


Expand Down
55 changes: 55 additions & 0 deletions src/z3c/form/form.txt
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,61 @@ Let's now render the page:
</body>
</html>

The update()/render() cycle is what happens when the form is called, i.e.
when it is published:

>>> print addForm()
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<form action=".">
<div class="row">
<label for="form-widgets-id">ID</label>
<input type="text" id="form-widgets-id"
name="form.widgets.id"
class="text-widget required textline-field"
value="" />
</div>
<div class="row">
<label for="form-widgets-name">Name</label>
<input type="text" id="form-widgets-name" name="form.widgets.name"
class="text-widget required textline-field"
value="" />
</div>
<div class="row">
<label for="form-widgets-gender">Gender</label>
<select id="form-widgets-gender" name="form.widgets.gender:list"
class="select-widget choice-field" size="1">
<option id="form-widgets-gender-novalue"
value="--NOVALUE--">no value</option>
<option id="form-widgets-gender-0" value="male">male</option>
<option id="form-widgets-gender-1" value="female">female</option>
</select>
<input name="form.widgets.gender-empty-marker" type="hidden"
value="1" />
</div>
<div class="row">
<label for="form-widgets-age">Age</label>
<input type="text" id="form-widgets-age" name="form.widgets.age"
class="text-widget int-field" value="20" />
</div>
<div class="action">
<input type="submit" id="form-buttons-add" name="form.buttons.add"
class="submit-widget button-field" value="Add" />
</div>
</form>
</body>
</html>

Note that we don't actually call render if the response has been set to a 3xx
type status code (e.g. a redirect or not modified response), since the browser
would not render it anyway:

>>> request.response.setStatus(304)
>>> print addForm()

Let's go back to a normal status to continue the test.

>>> request.response.setStatus(200)

Submitting an add form successfully
-----------------------------------
Expand Down

0 comments on commit d38079c

Please sign in to comment.