Compare commits
12 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f5db33ece | ||
|
|
0be01db0bb | ||
|
|
05a4e81edc | ||
|
|
3571bf223b | ||
|
|
5e3cc7fdde | ||
|
|
9682d6b371 | ||
|
|
1033a9757d | ||
|
|
c0a9ec43a1 | ||
|
|
2295bd072e | ||
|
|
988143b07b | ||
|
|
c84e1f7855 | ||
|
|
381477f0ab |
8 changed files with 101 additions and 8 deletions
16
CHANGES
16
CHANGES
|
|
@ -3,6 +3,22 @@ Flask Changelog
|
|||
|
||||
Here you can see the full list of changes between each Flask release.
|
||||
|
||||
Version 0.7.2
|
||||
-------------
|
||||
|
||||
Bugfix release, released on July 6th 2011
|
||||
|
||||
- Fixed an issue with URL processors not properly working on
|
||||
blueprints.
|
||||
|
||||
Version 0.7.1
|
||||
-------------
|
||||
|
||||
Bugfix release, released on June 29th 2011
|
||||
|
||||
- Added missing future import that broke 2.5 compatibility.
|
||||
- Fixed an infinite redirect issue with blueprints.
|
||||
|
||||
Version 0.7
|
||||
-----------
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
:license: BSD, see LICENSE for more details.
|
||||
"""
|
||||
|
||||
__version__ = '0.8-dev'
|
||||
__version__ = '0.7.2'
|
||||
|
||||
# utilities we import from Werkzeug and Jinja2 that are unused
|
||||
# in the module but are exported as public interface.
|
||||
|
|
|
|||
|
|
@ -706,6 +706,12 @@ class Flask(_PackageBoundObject):
|
|||
if 'OPTIONS' not in methods:
|
||||
methods = tuple(methods) + ('OPTIONS',)
|
||||
provide_automatic_options = True
|
||||
|
||||
# due to a werkzeug bug we need to make sure that the defaults are
|
||||
# None if they are an empty dictionary. This should not be necessary
|
||||
# with Werkzeug 0.7
|
||||
options['defaults'] = options.get('defaults') or None
|
||||
|
||||
rule = self.url_rule_class(rule, methods=methods, **options)
|
||||
rule.provide_automatic_options = provide_automatic_options
|
||||
self.url_map.add(rule)
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ class BlueprintSetupState(object):
|
|||
|
||||
#: A dictionary with URL defaults that is added to each and every
|
||||
#: URL that was defined with the blueprint.
|
||||
self.url_defaults = dict(self.blueprint.url_defaults)
|
||||
self.url_defaults = dict(self.blueprint.url_values_defaults)
|
||||
self.url_defaults.update(self.options.get('url_defaults', ()))
|
||||
|
||||
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
|
||||
|
|
@ -102,7 +102,7 @@ class Blueprint(_PackageBoundObject):
|
|||
self.view_functions = {}
|
||||
if url_defaults is None:
|
||||
url_defaults = {}
|
||||
self.url_defaults = url_defaults
|
||||
self.url_values_defaults = url_defaults
|
||||
|
||||
def record(self, func):
|
||||
"""Registers a function that is called when the blueprint is
|
||||
|
|
|
|||
|
|
@ -117,8 +117,6 @@ def render_template(template_name, **context):
|
|||
"""
|
||||
ctx = _request_ctx_stack.top
|
||||
ctx.app.update_template_context(context)
|
||||
if template_name[:1] == ':':
|
||||
template_name = ctx.request.blueprint + template_name
|
||||
return _render(ctx.app.jinja_env.get_template(template_name),
|
||||
context, ctx.app)
|
||||
|
||||
|
|
|
|||
|
|
@ -33,8 +33,8 @@ def parse_changelog():
|
|||
if change_info:
|
||||
break
|
||||
|
||||
match = re.match(r'^released on (\w+\s+\d+\w+\s+\d+)'
|
||||
r'(?:, codename (.*))?(?i)', change_info)
|
||||
match = re.search(r'released on (\w+\s+\d+\w+\s+\d+)'
|
||||
r'(?:, codename (.*))?(?i)', change_info)
|
||||
if match is None:
|
||||
continue
|
||||
|
||||
|
|
|
|||
2
setup.py
2
setup.py
|
|
@ -86,7 +86,7 @@ def run_tests():
|
|||
|
||||
setup(
|
||||
name='Flask',
|
||||
version='0.8-dev',
|
||||
version='0.7.2',
|
||||
url='http://github.com/mitsuhiko/flask/',
|
||||
license='BSD',
|
||||
author='Armin Ronacher',
|
||||
|
|
|
|||
|
|
@ -830,6 +830,37 @@ class BasicFunctionalityTestCase(unittest.TestCase):
|
|||
rv = c.post('/accept', data={'myfile': 'foo' * 100})
|
||||
assert rv.data == '42'
|
||||
|
||||
def test_url_processors(self):
|
||||
app = flask.Flask(__name__)
|
||||
|
||||
@app.url_defaults
|
||||
def add_language_code(endpoint, values):
|
||||
if flask.g.lang_code is not None and \
|
||||
app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
|
||||
values.setdefault('lang_code', flask.g.lang_code)
|
||||
|
||||
@app.url_value_preprocessor
|
||||
def pull_lang_code(endpoint, values):
|
||||
flask.g.lang_code = values.pop('lang_code', None)
|
||||
|
||||
@app.route('/<lang_code>/')
|
||||
def index():
|
||||
return flask.url_for('about')
|
||||
|
||||
@app.route('/<lang_code>/about')
|
||||
def about():
|
||||
return flask.url_for('something_else')
|
||||
|
||||
@app.route('/foo')
|
||||
def something_else():
|
||||
return flask.url_for('about', lang_code='en')
|
||||
|
||||
c = app.test_client()
|
||||
|
||||
self.assertEqual(c.get('/de/').data, '/de/about')
|
||||
self.assertEqual(c.get('/de/about').data, '/foo')
|
||||
self.assertEqual(c.get('/foo').data, '/en/about')
|
||||
|
||||
|
||||
class JSONTestCase(unittest.TestCase):
|
||||
|
||||
|
|
@ -1309,6 +1340,33 @@ class BlueprintTestCase(unittest.TestCase):
|
|||
self.assertEqual(c.get('/1/bar').data, u'23')
|
||||
self.assertEqual(c.get('/2/bar').data, u'19')
|
||||
|
||||
def test_blueprint_url_processors(self):
|
||||
bp = flask.Blueprint('frontend', __name__, url_prefix='/<lang_code>')
|
||||
|
||||
@bp.url_defaults
|
||||
def add_language_code(endpoint, values):
|
||||
values.setdefault('lang_code', flask.g.lang_code)
|
||||
|
||||
@bp.url_value_preprocessor
|
||||
def pull_lang_code(endpoint, values):
|
||||
flask.g.lang_code = values.pop('lang_code')
|
||||
|
||||
@bp.route('/')
|
||||
def index():
|
||||
return flask.url_for('.about')
|
||||
|
||||
@bp.route('/about')
|
||||
def about():
|
||||
return flask.url_for('.index')
|
||||
|
||||
app = flask.Flask(__name__)
|
||||
app.register_blueprint(bp)
|
||||
|
||||
c = app.test_client()
|
||||
|
||||
self.assertEqual(c.get('/de/').data, '/de/about')
|
||||
self.assertEqual(c.get('/de/about').data, '/de/')
|
||||
|
||||
def test_templates_and_static(self):
|
||||
from blueprintapp import app
|
||||
c = app.test_client()
|
||||
|
|
@ -1364,6 +1422,21 @@ class BlueprintTestCase(unittest.TestCase):
|
|||
self.assertEqual(c.get('/fe2').data.strip(), '/fe')
|
||||
self.assertEqual(c.get('/be').data.strip(), '/fe')
|
||||
|
||||
def test_empty_url_defaults(self):
|
||||
bp = flask.Blueprint('bp', __name__)
|
||||
|
||||
@bp.route('/', defaults={'page': 1})
|
||||
@bp.route('/page/<int:page>')
|
||||
def something(page):
|
||||
return str(page)
|
||||
|
||||
app = flask.Flask(__name__)
|
||||
app.register_blueprint(bp)
|
||||
|
||||
c = app.test_client()
|
||||
self.assertEqual(c.get('/').data, '1')
|
||||
self.assertEqual(c.get('/page/2').data, '2')
|
||||
|
||||
|
||||
class SendfileTestCase(unittest.TestCase):
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue