forked from moraes/webapp-improved
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCHANGES
More file actions
280 lines (199 loc) · 10.3 KB
/
CHANGES
File metadata and controls
280 lines (199 loc) · 10.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
Development version
===================
- Added webapp2_extras.local, with an extended WSGIApplication that uses
thread-local for globals and so can be used outside of App Engine.
- Added set_matcher() and set_builder() to Router, to set extended matcher and
builder.
- DomainRoute now updates matched keywords of the route using .groupdict().
This gives control of what is passed to the handler if a domain/subdomain
matches, and allows to not pass anything if no regex groups are defined.
- Routes now return the route on match() or routes with nested routes cannot
work. So instead of returning (args, kwargs) they return
(route, args, kwargs).
Version 1.3 - May 9, 2011
=========================
- Added webapp2_extras modules:
- webapp2_extras.i18n: internationalization support.
- webapp2_extras.sessions_memcache: memcache based sessions.
- webapp2_extras.sessions_ndb: datastore based sessions.
- Several api improvements in webapp2_extras.
Version 1.2 - May 6, 2011
=========================
- Removed Config from webapp2 core. It is now part of the new "webapp2_extras"
package.
- Added the package webapp2_extras. These are all optional modules that
complement webapp2 with common functionalities. Currently they include:
- webapp2_extras.config: Configuration object.
- webapp2_extras.jinja2: Support for Jinja2 templating.
- webapp2_extras.json: JSON utilities.
- webapp2_extras.routes: Extended route classes.
- webapp2_extras.securecookie: Signed cookie serializer.
- webapp2_extras.sessions: Sessions support.
Version 1.1 - May 5, 2011
=========================
- Simplified routing with an unified dispatch method for classes and functions.
Version 1.0 - May 1st, 2011
===========================
This is a major refactoring with some incompatible changes, mostly internal
stuff that won't be noticed in common usage.
- Changed signature of RequestHandler's constructor: it now receives only
(request, response) instead of (app, request, response).
- Added RequestContext class, which should help testing.
- Added .app attribute to Request, a reference to the active app.
- Refactored routing scheme:
- Now also supports function views besides classes.
- Now also supports normal functions as exception handlers, and exception
handlers don't need to be a subclass RequestHandler (but still can).
- Now also supports custom handler methods besides using the request method.
- Removed Request.context: was redundant with Request.registry.
- Renamed WSGIApplication.wsgi_app to WSGIApplication.dispatch.
- Moved ALLOWED_METHODS to WSGIApplication.allowed_methods.
- Moved get_valid_methods() to RequestHandler.get_valid_methods().
Version 0.7 - September 26, 2010
================================
- Added WSGIApplication.app and WSGIApplication.request, class attributes set
on each request to reference currently active app and request.
WSGIApplication.app is an alias to WSGIApplication.active_instance.
- Fixed double escaping of + in urlunsplit(). Thanks, alkis.
- IMPROVED: configuration now behaves exactly like a dictionary, still
auto-loading configuration values when needed and honoring required configs.
For example, we always used this::
bar = self.app.get_config('foo', 'bar')
Now it is also possible to use direct access and dict methods::
bar = self.app.config['foo']['bar']
# or...
bar = self.app.config['foo'].get('bar')
# or...
bar = self.app.config.get('foo').get('bar')
The previous get_config() method works as always.
Version 0.6 - August 31, 2010
=============================
- Fix: Anchors in generated URLs are quoted using urlib.quote, instead of
urlib.quote_plus.
- In Router.dispatch(), if an exception occurs while handling an exception,
raise it instead of trying to handle it again.
- Fixed bug when writing a unicode string to Response and charset is not set.
Thanks to martinc for the patch.
- Changed: the app won't fallback anymore to the exception handler set for
status 500 if handlers for other status are not set.
- Changed: exceptions are only logged when unhandled. It is up to exception
handlers to log them when appropriate.
Version 0.5.1 - August 17, 2010
===============================
- When a URL matches, some attributes are set in the request object:
- request.route: the matched route
- request.route_args: the matched positional arguments, a tuple
- request.route_kwargs: the matched keyword arguments, a dict
- WSGIApplication.handle_exception() doesn't automatically raises the exception
when in debug mode: it is up to the error handler to raise it if in dev; it
will be raised if no error handler is defined to handle it anyway.
- Added attributes, WSGIApplication.registry, Request.registry and
Request.context, dictionaries for objects in use during the app or request
lifetimes.
- Before passing the request method to the RequestHandler, '-' is replaced
by '_', so that a method like WebDav's 'VERSION-CONTROL' can be supported.
- Config.get() now only returns the passed default value when key is defined.
This is the intended, more predictable behavior: default is a default for
the key, not the module. For example::
# If config['foo']['bar'] is not set, return 'baz'.
config.get('foo', 'bar', default='baz')
# If config['foo'] is not set, return None. Default is ignored here.
config.get('foo', default='baz')
- Router initialization now receives the app as parameter, so that extended
routes can access app's config.
Version 0.5 - August 13, 2010
=============================
- Better compatibility with webapp:
- webapp2.WSGIapplication can be used with webapp.RequestHandler.
- webapp.WSGIapplication can be used with webapp2.RequestHandler.
Although the functionality becomes limited in both cases, this should help
migration.
- Review of Response based on observations from
http://pythonpaste.org/webob/differences.html#webapp-response:
- Response.out is now a reference to self, to use webob.Response's neat
.write() method which can handle both string and unicode.
- Response.clear() now sets .body = '' instead of .app_iter = [].
- Added Response.write(), for compatibility with StringIO behavior in webapp
when calling write() passing non-basestring values (issue 2).
- Removed url_escape() and url_unescape(). Unused or almost unused.
- ErrorHandlers can now be defined as strings to be lazily loaded, as they
now use the same dispatch mechanism of other handlers.
Backwards compatibility warning
-------------------------------
- The method handle_exception() is called from app-wide error handlers.
Previously, get() was called.
Version 0.4.1 - August 08, 2010
===============================
- Removed router parameter from get_routes(), get_match_routes(),
get_build_routes(). This simplifies multi-routes quite a bit.
Version 0.4 - August 07, 2010
=============================
- redirect() and redirect_to() now accept a keyword argument 'abort' to raise
an exception to do the redirect.
- '_netloc' can be passed to url_for() build URLs for a given domain or
subdomain.
- Added BaseRoute, an interface for custom routes. Several improvements make
the routing system more extensible, while the default Route class sticks to
the basics.
- Nested routes are now possible. As an example, `extras/routes.py` has several
classes that accept nested routes or extend routing in other ways:
- PathPrefixRoute: the idea of this route is to set a base path for other
routes::
app = WSGIApplication([
PathPrefixRoute('/users/<user:\w+>', [
Route('/', UserOverviewHandler, 'user-overview'),
Route('/profile', UserProfileHandler, 'user-profile'),
Route('/projects', UserProjectsHandler, 'user-projects'),
]),
])
The example above is the same as setting the following routes, just more
convenient as you can reuse the path prefix::
app = WSGIApplication([
Route('/users/<user:\w+>/', UserOverviewHandler, 'user-overview'),
Route('/users/<user:\w+>/profile', UserProfileHandler, 'user-profile'),
Route('/users/<user:\w+>/projects', UserProjectsHandler, 'user-projects'),
])
- NamePrefixRoute: Same as PathPrefixRoute, but prefixes the names of routes.
- HandlerPrefixRoute: Same as PathPrefixRoute, but prefixes the handlers of
routes.
- DomainRoute: a route used to restrict route matches to a given domain or
subdomain.
For example, to restrict routes to a subdomain of the appspot domain::
SUBDOMAIN_RE = '^([^.]+)\.app-id\.appspot\.com$'
app = WSGIApplication([
DomainRoute(SUBDOMAIN_RE, [
Route('/foo', 'FooHandler', 'subdomain-thing'),
]),
Route('/bar', 'BarHandler', 'normal-thing'),
])
- ImprovedRoute: a route with redirect_to and strict_slash.
- `redirect_to`: if set, the route is used to redirect to a URL. The value
can be a URL string or a callable that returns a URL. These two are
equivalent::
route = Route('/foo', RedirectHandler, defaults={'url': '/bar'})
route = Route('/foo', redirect_to='/bar')
- `strict_slash`: if True, redirects access to the same URL with different
trailing slash to the strict path defined in the rule. For example, take
these rules::
route = Route('/foo', FooHandler, strict_slash=True)
route = Route('/bar/', BarHandler, strict_slash=True)
Because **strict_slash** is True, this is what will happen:
- Access to ``/foo`` will execute ``FooHandler`` normally.
- Access to ``/bar/`` will execute ``BarHandler`` normally.
- Access to ``/foo/`` will redirect to ``/foo``.
- Access to ``/bar`` will redirect to ``/bar/``.
Version 0.3 - August 05, 2010
=============================
- Routes store the handler, as we had in 0.1. This allows custom routes to
have nested routes.
- Much improved URL building, now delegated to routes.
- added urlunsplit() helper.
Version 0.2 - August 04, 2010
=============================
- Fixed a bug in Route.match() that would make it return positional arguments
with wrong order. Dictionary is correctly sorted now.
- Added build_only option for routes: routes that are only used for url_for()
and never match.
Version 0.1 - August 03, 2010
=============================
- Initial release.