仿照django的urls风格和模块化结构的flask项目(Django-Style URL Patterns for Flask)

来源:互联网 发布:淘宝运营浏览器插件 编辑:程序博客网 时间:2024/06/13 14:10

Django-Style URL Patterns for Flask


django的urls集中式路由控制相比flask通过装饰器来控制的确很一目了然,习惯了django的urls模式,突然改到flask还有点怀念,于是通过Flask.add_url_rule函数实现了一个仿django的urls模式。


github: https://github.com/pushiqiang/flask_url/tree/master/blog


目录结构

blog

      ---__init__.py

      ---settings.py

      ---urls.py

      ---views.py

post

      ---__init__.py

      ---urls.py

      ---views.py

url_resolvers

      ---__init__.py

      ---resolvers.py

     

注册urls.py的映射:

url_resolvers/resolvers.py

# -*- coding: utf-8 -*-import osfrom importlib import import_moduleimport sixfrom exceptions import ImproperlyConfiguredclass URLPattern(object):    def __init__(self, regex, view, name, kwargs):        self.regex = regex        self.view = view        self.kwargs = kwargs        self.name = nameclass URLIncludePatterns(object):    def __init__(self, urlconf_module):        self.patterns = []        if isinstance(urlconf_module, six.string_types):            try:                urlconf_module = import_module(urlconf_module)            except ImportError:                raise ImproperlyConfigured('Urls is not configured correctly')        self.patterns = getattr(urlconf_module, 'urlpatterns')        if filter(lambda pattern: isinstance(pattern, URLIncludePatterns), self.patterns):            raise ImproperlyConfigured(                'Using included patterns in an included URLconf is not allowed.')class RegexURLResolver(object):    def __init__(self, regex, include, kwargs):        self.patterns = include.patterns        self.regex = regex        self.kwargs = kwargs        for pattern in self.patterns:            if pattern.regex.startswith('/'):                pattern.regex = os.path.join(regex, pattern.regex.lstrip('/'))            else:                pattern.regex = os.path.join(regex, pattern.regex)def url(regex, view, name=None, kwargs=None):    # include    if isinstance(view, URLIncludePatterns):        return RegexURLResolver(regex, view, kwargs)    # url    elif callable(view):        return URLPattern(regex, view, name, kwargs)    else:        raise TypeError('view must be a callable or a list/tuple in the case of include().')include = URLIncludePatternsdef auto_register_url(app):    """    自动注册url映射    """    try:        urlconf_module = import_module(app.config['ROOT_URLCONF'])    except (KeyError, ImportError):        raise ImproperlyConfigured('ROOT_URLCONF is not configured correctly')    url_patterns = getattr(urlconf_module, 'urlpatterns')    for url_pattern in url_patterns:        if isinstance(url_pattern, URLPattern):            app.add_url_rule(                url_pattern.regex,                endpoint=url_pattern.name,                view_func=url_pattern.view            )        else:            for pattern in url_pattern.patterns:                app.add_url_rule(                    pattern.regex,                    endpoint=pattern.name,                    view_func=pattern.view                )

使用:

__init__.py

# -*- coding: utf-8 -*-import osfrom flask import Flaskfrom url_resolvers.resolvers import auto_register_urlimport settingsBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))app = Flask(__name__)app.config.from_object(settings)# 自动注册urls路径auto_register_url(app)

配置:

settings.py

# -*- encoding: utf-8 -*-"""配置文件"""ROOT_URLCONF = 'blog.urls'

example:

# 根urls.py配置# -*- coding: utf-8 -*-from url_resolvers.resolvers import url, includefrom views import homeurlpatterns = [    url('/home/', home, ),    url('/post/', include('post.urls')),]# app  urls.py# -*- coding: utf-8 -*-from url_resolvers.resolvers import url, includefrom .views import indexurlpatterns = [    url('index/', index, name='index'),]


原创粉丝点击