blob: 71fb2a4d7f711d577c05e4006a8bff9d1f9514bf (
plain)
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
|
.. _qtut_routing:
==========================================
11: Dispatching URLs To Views With Routing
==========================================
Routing matches incoming URL patterns to view code. Pyramid's routing has a
number of useful features.
Background
==========
Writing web applications usually means sophisticated URL design. We just saw
some Pyramid machinery for requests and views. Let's look at features that help
in routing.
Previously we saw the basics of routing URLs to views in Pyramid.
- Your project's "setup" code registers a route name to be used when matching
part of the URL
- Elsewhere a view is configured to be called for that route name.
.. note::
Why do this twice? Other Python web frameworks let you create a route and
associate it with a view in one step. As illustrated in
:ref:`routes_need_ordering`, multiple routes might match the same URL
pattern. Rather than provide ways to help guess, Pyramid lets you be
explicit in ordering. Pyramid also gives facilities to avoid the problem.
It's relatively easy to build a system that uses implicit route ordering
with Pyramid too. See `The Groundhog series of screencasts
<https://web.archive.org/web/20190118040819/http://static.repoze.org/casts/videotags.html>`_ if you're interested in
doing so.
Objectives
==========
- Define a route that extracts part of the URL into a Python dictionary.
- Use that dictionary data in a view.
Steps
=====
#. First we copy the results of the ``view_classes`` step:
.. code-block:: bash
cd ..; cp -r view_classes routing; cd routing
$VENV/bin/pip install -e .
#. Our ``routing/tutorial/__init__.py`` needs a route with a replacement
pattern:
.. literalinclude:: routing/tutorial/__init__.py
:linenos:
#. We just need one view in ``routing/tutorial/views.py``:
.. literalinclude:: routing/tutorial/views.py
:linenos:
#. We just need one view in ``routing/tutorial/home.pt``:
.. literalinclude:: routing/tutorial/home.pt
:language: html
:linenos:
#. Update ``routing/tutorial/tests.py``:
.. literalinclude:: routing/tutorial/tests.py
:linenos:
#. Now run the tests:
.. code-block:: bash
$VENV/bin/pytest tutorial/tests.py -q
..
2 passed in 0.39 seconds
#. Run your Pyramid application with:
.. code-block:: bash
$VENV/bin/pserve development.ini --reload
#. Open http://localhost:6543/howdy/amy/smith in your browser.
Analysis
========
In ``__init__.py`` we see an important change in our route declaration:
.. code-block:: python
config.add_route('hello', '/howdy/{first}/{last}')
With this we tell the :term:`configurator` that our URL has a "replacement
pattern". With this, URLs such as ``/howdy/amy/smith`` will assign ``amy`` to
``first`` and ``smith`` to ``last``. We can then use this data in our view:
.. code-block:: python
self.request.matchdict['first']
self.request.matchdict['last']
``request.matchdict`` contains values from the URL that match the "replacement
patterns" (the curly braces) in the route declaration. This information can
then be used anywhere in Pyramid that has access to the request.
Extra credit
============
#. What happens if you to go the URL http://localhost:6543/howdy? Is this the
result that you expected?
.. seealso:: `Weird Stuff You Can Do With URL Dispatch
<https://web.archive.org/web/20170131192830/http://www.plope.com/weird_pyramid_urldispatch>`_
|