Mercurial > piecrust2
comparison piecrust/serving/util.py @ 555:daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 12 Aug 2015 23:04:46 -0700 |
parents | cc6f3dbe3048 |
children | 657384f08ca3 |
comparison
equal
deleted
inserted
replaced
554:155c7e20414f | 555:daf8df5ade7d |
---|---|
3 import hashlib | 3 import hashlib |
4 import logging | 4 import logging |
5 import datetime | 5 import datetime |
6 from werkzeug.wrappers import Response | 6 from werkzeug.wrappers import Response |
7 from werkzeug.wsgi import wrap_file | 7 from werkzeug.wsgi import wrap_file |
8 from piecrust.app import PieCrust | |
9 from piecrust.rendering import QualifiedPage | |
10 from piecrust.routing import RouteNotFoundError | |
11 from piecrust.sources.base import MODE_PARSING | |
12 from piecrust.sources.pageref import PageNotFoundError | |
13 from piecrust.uriutil import split_sub_uri | |
8 | 14 |
9 | 15 |
10 logger = logging.getLogger(__name__) | 16 logger = logging.getLogger(__name__) |
17 | |
18 | |
19 def get_app_for_server(root_dir, debug=False, sub_cache_dir=None): | |
20 app = PieCrust(root_dir=root_dir, debug=debug) | |
21 if sub_cache_dir: | |
22 app._useSubCacheDir(sub_cache_dir) | |
23 app.config.set('site/root', '/') | |
24 app.config.set('server/is_serving', True) | |
25 return app | |
26 | |
27 | |
28 class RequestedPage(object): | |
29 def __init__(self, qualified_page): | |
30 self.qualified_page = qualified_page | |
31 self.req_path = None | |
32 self.page_num = 1 | |
33 self.not_found_errors = [] | |
34 | |
35 | |
36 def find_routes(routes, uri): | |
37 res = [] | |
38 tax_res = [] | |
39 for route in routes: | |
40 metadata = route.matchUri(uri) | |
41 if metadata is not None: | |
42 if route.is_taxonomy_route: | |
43 tax_res.append((route, metadata)) | |
44 else: | |
45 res.append((route, metadata)) | |
46 return res + tax_res | |
47 | |
48 | |
49 def get_requested_page(app, req_path): | |
50 # Try to find what matches the requested URL. | |
51 req_path, page_num = split_sub_uri(app, req_path) | |
52 | |
53 routes = find_routes(app.routes, req_path) | |
54 if len(routes) == 0: | |
55 raise RouteNotFoundError("Can't find route for: %s" % req_path) | |
56 | |
57 qp = None | |
58 not_found_errors = [] | |
59 for route, route_metadata in routes: | |
60 try: | |
61 qp = _get_requested_page_for_route( | |
62 app, route, route_metadata, req_path) | |
63 if qp is not None: | |
64 break | |
65 except PageNotFoundError as nfe: | |
66 not_found_errors.append(nfe) | |
67 | |
68 req_page = RequestedPage(qp) | |
69 req_page.req_path = req_path | |
70 req_page.page_num = page_num | |
71 req_page.not_found_errors = not_found_errors | |
72 return req_page | |
73 | |
74 | |
75 def _get_requested_page_for_route(app, route, route_metadata, req_path): | |
76 taxonomy = None | |
77 source = app.getSource(route.source_name) | |
78 if route.taxonomy_name is None: | |
79 factory = source.findPageFactory(route_metadata, MODE_PARSING) | |
80 if factory is None: | |
81 raise PageNotFoundError("No path found for '%s' in source '%s'." % | |
82 (req_path, source.name)) | |
83 else: | |
84 taxonomy = app.getTaxonomy(route.taxonomy_name) | |
85 | |
86 # This will raise `PageNotFoundError` naturally if not found. | |
87 tax_page_ref = taxonomy.getPageRef(source) | |
88 factory = tax_page_ref.getFactory() | |
89 | |
90 # Build the page. | |
91 page = factory.buildPage() | |
92 qp = QualifiedPage(page, route, route_metadata) | |
93 return qp | |
11 | 94 |
12 | 95 |
13 def load_mimetype_map(): | 96 def load_mimetype_map(): |
14 mimetype_map = {} | 97 mimetype_map = {} |
15 sep_re = re.compile(r'\s+') | 98 sep_re = re.compile(r'\s+') |