仿照django的urls风格和模块化结构的flask项目(Django-Style URL Patterns for Flask)
2017-07-19 09:52
495 查看
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 os from importlib import import_module import six from exceptions import ImproperlyConfigured class URLPattern(object): def __init__(self, regex, view, name, kwargs): self.regex = regex self.view = view self.kwargs = kwargs self.name = name class 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 = URLIncludePatterns def 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 os from flask import Flask from url_resolvers.resolvers import auto_register_url import settings BASE_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, include from views import home urlpatterns = [ url('/home/', home, ), url('/post/', include('post.urls')), ] # app urls.py # -*- coding: utf-8 -*- from url_resolvers.resolvers import url, include from .views import index urlpatterns = [ url('index/', index, name='index'), ]
相关文章推荐
- Update your urlpatterns to be a list of django.conf.urls.url() instances instead. Django 1.10. Updat
- Android开源项目-编码风格规范-Code Style Guidelines for Contributors
- Android开源项目-编码风格规范-Code Style Guidelines for Contributors
- Android开源项目-编码风格规范-Code Style Guidelines for Contributors[原创译文]
- Flask--项目结构
- Flask中url_for
- django开发个人简易Blog——构建项目结构
- [原]敏捷开发项目中升级mysql数据库,谈谈结构、数据比对,navicat for mysql + dbForge Data Compare for MySQL 足矣!
- flask项目结构的基本搭建
- flask 的url_for
- django获取项目所有的URL
- Flask 即插视图中使用 url_for 获取重定向的目标路径
- 使用apidoc管理RESTful风格Flask项目接口文档方法
- django快速获取项目所有的URL
- A simple HTTP PHP class to crawl a URL for internal and external URLs
- django快速获取项目所有的URL
- flask开发restful api系列(7)-蓝图与项目结构
- 【Flask】 项目结构说明
- URLForResource加载项目内的HTML
- Aptana下Django1.6以后的项目模板结构改造