Django内置的server基本包括两部分:django.core.servers和django.core.handlers

本文介绍了Django内置服务器的基本结构,主要包括django.core.servers和django.core.handlers两个部分。servers.basehttp模块提供了一个用于开发测试的WSGIServer,而handlers模块中的BaseHandler和WSGIHandler负责处理请求和响应。WSGIHandler通过__call__方法符合WSGI规范,并处理中间件、异常和响应。


Django内置的server基本包括两部分:django.core.servers和django.core.handlers


相识
servers.basehttp是Django自身提供的一个用于开发测试的server模块,其中提供的WSGIServer、ServerHandler、WSGIRequestHandler其实都是属于WSGI server,django只不过是对python内置的WSGI模块simple_server做的一层包装。

handlers package包括base.py和wsgi.py两个模块。
base.py中只定义了一个BaseHandler类,它复杂一些基础的功能,比如加载中间件,处理异常,获取响应数据等

wsgi.py才是主角,其中最重要的就是WSGIHandler类,它继承了base.py中的BaseHandler,只添加了一个__call__方法,那为什么添加这个方法呢?

django.core.wsgi

import django
from django.core.handlers.wsgi import WSGIHandler


def get_wsgi_application():
    """
    The public interface to Django's WSGI support. Should return a WSGI
    callable.

    Allows us to avoid making django.core.handlers.WSGIHandler public API, in
    case the internal WSGI implementation changes or moves in the future.
    """
    django.setup()
    return WSGIHandler()
可见我们启动server时传入的application其实是WSGIHandler的一个实例,而根据WSGI规范,这个application必须要是callable,python中的callable包括函数、方法以及任何定义了__call__方法的对象

回到handlers.wsgi

class WSGIHandler(base.BaseHandler):
    initLock = Lock()
    request_class = WSGIRequest

    def __call__(self, environ, start_response):
        # Set up middleware if needed. We couldn't do this earlier, because
        # settings weren't available.
        if self._request_middleware is None:
            with self.initLock:
                try:
                    # Check that middleware is still uninitialized.
                    if self._request_middleware is None:
                        self.load_middleware()
                except:
                    # Unload whatever middleware we got
                    self._request_middleware = None
                    raise

        set_script_prefix(get_script_name(environ))
        signals.request_started.send(sender=self.__class__, environ=environ)
        try:
            request = self.request_class(environ)
        except UnicodeDecodeError:
            logger.warning('Bad Request (UnicodeDecodeError)',
                exc_info=sys.exc_info(),
                extra={
                    'status_code': 400,
                }
            )
            response = http.HttpResponseBadRequest()
        else:
            response = self.get_response(request)

        response._handler_class = self.__class__

        status = '%s %s' % (response.status_code, response.reason_phrase)
        response_headers = [(str(k), str(v)) for k, v in response.items()]
        for c in response.cookies.values():
            response_headers.append((str('Set-Cookie'), str(c.output(header=''))))
        start_response(force_str(status), response_headers)
        if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'):
            response = environ['wsgi.file_wrapper'](response.file_to_stream)
        return response
由于__call__是一个请求的入口,它需要调用BaseHandler中定义的方法去执行加载中间件等一系列操作和异常处理,除此之外,WSGIHandler还会处理cookie、触发signal等。

至于如何返回响应,具体可看handlers.base模块,大概就是找出请求的path,通过匹配路由,找到并执行用户定义的view方法,执行中间件处理方法,最后返回响应。当然,还有一系列的异常处理。

<think>我们正在处理一个关于Django框架中WSGIRequest对象的问题。用户希望了解如何解析这个对象,即如何从中提取数据。 根据引用,我们知道: 1. WSGIRequest对象是Django在接收到HTTP请求时创建的,它封装了所有的请求信息。 2. 这个对象会作为视图函数的第一个参数(通常命名为request)传递给视图函数。 在Django中,解析WSGIRequest对象通常指的是从该对象中获取客户端发送的数据,包括: - 查询参数(GET参数) - 表单数据(POST参数) - 上传的文件(FILES) - 路径参数(通过URL捕获的参数) - 请求头信息(META) - 以及其他属性如cookies、session等。 引用[5]提供了一些常用属性,我们可以利用这些属性来获取数据。 因此,解析WSGIRequest的方法就是访问其各个属性来获取所需的信息。 下面我将详细说明如何从WSGIRequest对象中获取不同类型的数据: 1. 获取GET请求参数(查询字符串): 使用 `request.GET`,它是一个类似字典的对象,可以通过键来获取值。 例如:`name = request.GET.get('name')` 2. 获取POST请求参数(表单数据): 使用 `request.POST`,同样是一个类似字典的对象。 例如:`username = request.POST.get('username')` 3. 获取上传的文件: 使用 `request.FILES`,也是一个类似字典的对象,每个值是一个UploadedFile对象。 例如:`file = request.FILES.get('myfile')` 4. 获取请求路径: `request.path` - 返回请求的路径部分(不含域名参数)。 5. 获取请求方法: `request.method` - 返回请求的HTTP方法,如'GET', 'POST'等。 6. 获取请求头信息: 使用 `request.META`,它是一个字典,包含了所有的HTTP头部信息。注意,Django会将一些头部转换为特定的键,例如: - `CONTENT_LENGTH`: 请求体的长度(字符串) - `CONTENT_TYPE`: 请求体的MIME类型 - `HTTP_ACCEPT`: 浏览器可接受的MIME类型 - 其他的HTTP头部会被加上`HTTP_`前缀并转换为大写,例如:`HTTP_USER_AGENT`。 例如,获取用户代理:`user_agent = request.META.get('HTTP_USER_AGENT')` 7. 获取COOKIES: 使用 `request.COOKIES`,它是一个字典,包含所有的cookie。 8. 获取SESSION: 使用 `request.session`,可以像字典一样使用,但它是服务器端会话数据。 9. 获取URL路径参数: 如果URL配置中捕获了参数,那么这些参数可以通过`request.resolver_match`获取,但更常见的是在视图函数中直接接收(如果使用Django的URL分发机制,参数会直接传递给视图函数)。 另外,如果使用了Django REST framework(DRF)等扩展,还会有`request.data`属性,用于获取解析后的请求体数据(如JSON数据)。但在纯Django中,对于非表单数据(如JSON),我们需要手动解析请求体。 注意:对于POST请求,如果请求的内容类型是`application/json`,Django默认不会将其解析到`request.POST`中。我们需要通过`request.body`获取原始数据,然后使用`json.loads`进行解析。 示例:解析JSON数据 ```python import json if request.method == 'POST' and request.content_type == 'application/json': data = json.loads(request.body) ``` 总结:解析`django.core.handlers.wsgi.WSGIRequest`对象就是通过访问其属性来获取请求中的各种数据。 下面我将根据回答要求生成相关内容。 </think>### 解析 Django WSGIRequest 对象的方法 在 Django 框架中,`django.core.handlers.wsgi.WSGIRequest` 对象封装了所有 HTTP 请求信息。解析该对象主要通过访问其属性方法实现: #### 1. **基础属性解析** ```python # 获取请求路径方法 path = request.path # 请求路径(不含参数域名) method = request.method # HTTP 方法(GET/POST等) # 示例:获取客户端请求路径方法 print(f"请求路径: {request.path}, 方法: {request.method}") ``` #### 2. **参数解析** ```python # GET 参数(URL查询参数) name = request.GET.get('name', 'default') # 字典式访问 # POST 参数(表单数据) email = request.POST.get('email') # 文件上传(multipart/form-data) uploaded_file = request.FILES.get('file') ``` #### 3. **头部与元数据** ```python # 请求头信息(META字典) user_agent = request.META.get('HTTP_USER_AGENT') content_type = request.META.get('CONTENT_TYPE') # Cookie 访问 session_id = request.COOKIES.get('sessionid') ``` #### 4. **会话与状态** ```python # Session 数据(需中间件支持) user_id = request.session.get('user_id') # 用户认证状态 is_authenticated = request.user.is_authenticated ``` #### 5. **原始数据处理** 对于非表单数据(如 JSON): ```python import json if request.content_type == 'application/json': data = json.loads(request.body) # 解析原始请求体 ``` > **关键特性** > WSGIRequest 作为可调用对象(`__call__`),符合 WSGI 规范[^1]。其核心属性包括: > - `GET`/`POST`:类字典对象存储参数 > - `FILES`:上传文件集合 > - `META`:HTTP 头部服务器变量[^5] > - `session`:服务器端会话数据 > - `path`/`method`:基础请求信息 #### 完整解析示例 ```python def api_handler(request): # request 即为 WSGIRequest 实例 # 解析路径参数 print(f"访问 {request.path} 的 {request.method} 请求") # 解析查询参数 page = request.GET.get('page', 1) # 解析 JSON 数据 if request.method == 'POST' and request.content_type == 'application/json': data = json.loads(request.body) user_id = data.get('user_id') # 验证会话 if request.session.get('logged_in'): return HttpResponse("操作成功") return HttpResponse("未授权", status=401) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值