【问题标题】:How to package plain JSON content in a WSGI response?如何在 WSGI 响应中打包纯 JSON 内容?
【发布时间】:2022-06-13 09:27:56
【问题描述】:

我有一个 Django WSGI(不是我的决定)网站调用获取动态生成的 JavaScript。我将函数放在views.py中,它正在接收请求并执行工作,但返回值被拒绝。

调用此函数的 HTML(网页的 JavaScript 部分)是这样的:

  var jscript = document.createElement('script');
  jscript.id = 'generate';
  jscript.style.visibility = 'hidden';
  jscript.style.display = 'none';
  jscript.src = `/generate?callback=catchOptions${query}`;  // jsonp https://en.wikipedia.org/wiki/JSONP query is a list of parameters in query string format                                                                                
  if (document.getElementById("generate") == null)
      document.body.appendChild(jscript);  // javascript needs this to work properly             

有将 /generate 映射到 /generate_planet 的地图文件(见下文)。进入该功能效果很好。这是 Djangoff 拒绝的返回值。

Here is the function in views.py
from cgitb import reset
from django.shortcuts import render
from . import planetor
from django.http import JsonResponse

def generate_planet(request):
    res = planetor.generate(request.content_params, "/app/planetor/", "FRAMES=1")
    # res is JSON text, NOT a python dict
    return res

# res looks like this:`callback({'camera_location': '-30,-30,-30', 'camera_angle': '30', 'sun_color': '5,5,5', 'sun_position': '10000,0,-10000', 'planet_size': '20.06', 'background': 'background_2.jpg', 'planet': 'surface_1.jpg', 'clouds_size': '1.02', 'clouds': 'clouds_16.jpg', 'clouds_density': '0.80', 'atmosphere': 'iodine', 'atmosphere_density': '0.95', 'atmosphere_size': '1.03', 'moons': '4', 'moon_position': None, 'moon_size': None, 'moon': None, 'random_color': None, 'random_float': None, 'random_trans': None, 'star_system': 'Barnard', 'star_index': 'Zeta', 'planet_index': 'II', 'planet_type': 'Surface ', 'identity': '81654447928', 'designation': 'v_star_index v_star_system v_planet_index', 'clouds_file': 'clouds_16.jpg'})

函数调用确实有效,“planetor.generate()”运行。问题是,由此返回的 JSON(实际上是 JSONP)被 Djangoff 拒绝

Djangoff 吐出这个:

Internal Server Error: /generate_planet
    Traceback (most recent call last):
      File "/usr/local/lib/python3.9/dist-packages/django/core/handlers/exception.py", line 47, in inner
        response = get_response(request)
      File "/usr/local/lib/python3.9/dist-packages/django/utils/deprecation.py", line 119, in __call__
        response = self.process_response(request, response)
      File "/usr/local/lib/python3.9/dist-packages/django/middleware/clickjacking.py", line 33, in process_response
        response.headers['X-Frame-Options'] = self.get_xframe_options_value(
    AttributeError: 'dict' object has no attribute 'headers'
    [05/Jun/2022 16:52:11] "GET /generate_planet? HTTP/1.1" 500 56694

它正在寻找将返回值包装在我确定的东西中,但在我的一生中我找不到 1)WSGIResponse 的任何 API 文档,我可以构建一个和 2)任何人做任何事情的例子这与 Djangoff

【问题讨论】:

标签: javascript html django wsgi


【解决方案1】:

我终于明白了。

如果你向 Django 发送请求,像这样:

/my_request?key1=value1&key2=value2&key3=value3

通过任何方式(原始 URL、表单提交、ajax 请求等)

要让 Django 捕获该请求并返回 JavaScript 答案(包括简单的 JSON,即 JavaScript),请在 views.py 中放置这样的函数

def my_request(请求): selections = request.GET #

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多