1 | # https://pyisapie.svn.sourceforge.net/svnroot/pyisapie/Tags/1.0.121/PyISAPIe/Python/Examples/Django/pyisapie.py
|
---|
2 | # 91 2008-01-10 23:53:59 -0800 (Thu, 10 Jan 2008)
|
---|
3 | # (C)2008 Phillip Sitbon <phillip@sitbon.net>
|
---|
4 | #
|
---|
5 | """Custom request handler for PyISAPIe.
|
---|
6 | """
|
---|
7 |
|
---|
8 | from django.core.handlers.base import BaseHandler
|
---|
9 | from django.core import signals
|
---|
10 | from django.dispatch import dispatcher
|
---|
11 | from django.utils import datastructures
|
---|
12 | from django import http
|
---|
13 | import os
|
---|
14 |
|
---|
15 | from Http import *
|
---|
16 |
|
---|
17 | class PyISAPIeRequest(http.HttpRequest):
|
---|
18 | def __init__(This):
|
---|
19 | This.method = Env.REQUEST_METHOD.upper()
|
---|
20 | This.path = Env.URL
|
---|
21 | # aren't list comprehensions fun?!
|
---|
22 | This._headers_in = \
|
---|
23 | dict((N.lower(), V) for N, V in [Item.split(': ',1) for Item in Env.ALL_RAW.split('\r\n') if Item])
|
---|
24 |
|
---|
25 | def get_full_path(This):
|
---|
26 | Qs = Env.QUERY_STRING
|
---|
27 | return '%s%s' % (This.path, Qs and ('?' + Qs) or '')
|
---|
28 |
|
---|
29 | def _load_post_and_files(This):
|
---|
30 | "Populates This._post and This._files"
|
---|
31 | Ctype = Env.HTTP_CONTENT_TYPE or ''
|
---|
32 | if Ctype.startswith('multipart'):
|
---|
33 | This._post, This._files = http.parse_file_upload(This._headers_in, This.raw_post_data)
|
---|
34 | else:
|
---|
35 | This._post, This._files = http.QueryDict(This.raw_post_data), datastructures.MultiValueDict()
|
---|
36 |
|
---|
37 | def _get_request(This):
|
---|
38 | if not hasattr(This, '_request'):
|
---|
39 | This._request = datastructures.MergeDict(This.POST, This.GET)
|
---|
40 | return This._request
|
---|
41 |
|
---|
42 | def _get_get(This):
|
---|
43 | if not hasattr(This, '_get'):
|
---|
44 | This._get = http.QueryDict(Env.QUERY_STRING)
|
---|
45 | return This._get
|
---|
46 |
|
---|
47 | def _set_get(This, get):
|
---|
48 | This._get = get
|
---|
49 |
|
---|
50 | def _get_post(This):
|
---|
51 | if not hasattr(This, '_post'):
|
---|
52 | This._load_post_and_files()
|
---|
53 | return This._post
|
---|
54 |
|
---|
55 | def _set_post(This, post):
|
---|
56 | This._post = post
|
---|
57 |
|
---|
58 | def _get_cookies(This):
|
---|
59 | if not hasattr(This, '_cookies'):
|
---|
60 | This._cookies = http.parse_cookie(This._headers_in.get('cookie', ''))
|
---|
61 | return This._cookies
|
---|
62 |
|
---|
63 | def _set_cookies(This, cookies):
|
---|
64 | This._cookies = cookies
|
---|
65 |
|
---|
66 | def _get_files(This):
|
---|
67 | if not hasattr(This, '_files'):
|
---|
68 | This._load_post_and_files()
|
---|
69 | return This._files
|
---|
70 |
|
---|
71 | def _get_meta(This):
|
---|
72 | "Lazy loader that returns This.META dictionary"
|
---|
73 | if not hasattr(This, '_meta'):
|
---|
74 | This._meta = {
|
---|
75 | 'AUTH_TYPE': Env.AUTH_TYPE,
|
---|
76 | 'CONTENT_LENGTH': Env.CONTENT_LENGTH,
|
---|
77 | 'CONTENT_TYPE': Env.CONTENT_TYPE,
|
---|
78 | 'GATEWAY_INTERFACE': Env.GATEWAY_INTERFACE,
|
---|
79 | 'PATH_INFO': Env.PATH_INFO,
|
---|
80 | 'PATH_TRANSLATED': Env.PATH_TRANSLATED,
|
---|
81 | 'QUERY_STRING': Env.QUERY_STRING,
|
---|
82 | 'REMOTE_ADDR': Env.REMOTE_ADDR,
|
---|
83 | 'REMOTE_HOST': Env.REMOTE_HOST,
|
---|
84 | 'REMOTE_IDENT': None,
|
---|
85 | 'REMOTE_USER': Env.REMOTE_USER,
|
---|
86 | 'REQUEST_METHOD': Env.REQUEST_METHOD,
|
---|
87 | 'SCRIPT_NAME': Env.SCRIPT_NAME,
|
---|
88 | 'SERVER_NAME': Env.SERVER_NAME,
|
---|
89 | 'SERVER_PORT': Env.SERVER_PORT,
|
---|
90 | 'SERVER_PROTOCOL': Env.SERVER_PROTOCOL,
|
---|
91 | 'SERVER_SOFTWARE': Env.SERVER_SOFTWARE
|
---|
92 | }
|
---|
93 | for key, value in This._headers_in.items():
|
---|
94 | key = 'HTTP_' + key.upper().replace('-', '_')
|
---|
95 | This._meta[key] = value
|
---|
96 | return This._meta
|
---|
97 |
|
---|
98 | def _get_raw_post_data(This):
|
---|
99 | try:
|
---|
100 | return This._raw_post_data
|
---|
101 | except AttributeError:
|
---|
102 | This._raw_post_data = Read()
|
---|
103 | return This._raw_post_data
|
---|
104 |
|
---|
105 | def _get_user(This):
|
---|
106 | if not hasattr(This, '_user'):
|
---|
107 | from django.models.auth import users
|
---|
108 | try:
|
---|
109 | user_id = This.session[users.SESSION_KEY]
|
---|
110 | if not user_id:
|
---|
111 | raise ValueError
|
---|
112 | This._user = users.get_object(pk=user_id)
|
---|
113 | except (AttributeError, KeyError, ValueError, users.UserDoesNotExist):
|
---|
114 | from django.parts.auth import anonymoususers
|
---|
115 | This._user = anonymoususers.AnonymousUser()
|
---|
116 | return This._user
|
---|
117 |
|
---|
118 | def _set_user(This, user):
|
---|
119 | This._user = user
|
---|
120 |
|
---|
121 | GET = property(_get_get, _set_get)
|
---|
122 | POST = property(_get_post, _set_post)
|
---|
123 | COOKIES = property(_get_cookies, _set_cookies)
|
---|
124 | FILES = property(_get_files)
|
---|
125 | META = property(_get_meta)
|
---|
126 | REQUEST = property(_get_request)
|
---|
127 | raw_post_data = property(_get_raw_post_data)
|
---|
128 | user = property(_get_user, _set_user)
|
---|
129 |
|
---|
130 | class PyISAPIeHandler(BaseHandler):
|
---|
131 | def __call__(This):
|
---|
132 | from django.conf import settings
|
---|
133 |
|
---|
134 |
|
---|
135 | if This._request_middleware is None:
|
---|
136 | This.load_middleware()
|
---|
137 |
|
---|
138 | dispatcher.send(signal=signals.request_started)
|
---|
139 |
|
---|
140 | try:
|
---|
141 | request = PyISAPIeRequest()
|
---|
142 | response = This.get_response(request)
|
---|
143 |
|
---|
144 | # Apply response middleware
|
---|
145 | for middleware_method in This._response_middleware:
|
---|
146 | response = middleware_method(request, response)
|
---|
147 |
|
---|
148 | finally:
|
---|
149 | dispatcher.send(signal=signals.request_finished)
|
---|
150 |
|
---|
151 |
|
---|
152 | process_response(response)
|
---|
153 |
|
---|
154 | def process_response(http_response):
|
---|
155 | from django.conf import settings
|
---|
156 | for itm in http_response.items():
|
---|
157 | Header("%s: %s" % itm)
|
---|
158 | for c in http_response.cookies.values():
|
---|
159 | Header('Set-Cookie: ' + c.output(header=''))
|
---|
160 | Header(Status = http_response.status_code)
|
---|
161 | for chunk in http_response:
|
---|
162 | Write(chunk)
|
---|
163 |
|
---|