python - 我必须调用多个网页来提取 django 应用程序的信息,然后显示它,但我不知道如何正确显示
问题描述
我的问题是,当我调用外部网页并在 for 循环中显示为 {{ html }} 时,它会为所有这些网页打印,有没有办法只为一个网页打印。b'{"carpark_name": "multi-storey", "date": "01-11-21 12:46:55", "spaces_available": 332}' 之后的 部分是网页
这是我的意见.py
from django.shortcuts import render
from .models import Carpark, Campus
from urllib.request import urlopen
def index(request):
campus_list = Campus.objects.all()
carpark_list = Carpark.objects.all()
noparking = Campus.objects.filter(carpark=None)
html = urlopen("https://mbezbradica.pythonanywhere.com/carparks/multi-storey").read()
context = {'carpark_list': carpark_list,
'campus_list': campus_list,
'noparking': noparking,
'html' : html
}
return render(request, "parkatdcu/index.html", context)
这是我的 index.html 代码
<h1>Welcome to ParkAtDCU</h1>
{% for campus in campus_list %}
<h2>
{{ campus }}
</h2>
{% if campus in noparking %}
No carparks found
{% else %}
<ul>
{% for carpark in carpark_list %}
{% if campus == carpark.campus_id %}
<li> {{ carpark.name }}: {{ carpark.spaces}} spaces, {{carpark.disabled_spaces}} spaces for people with disabilities, {{ html }}</li>
{% endif %}
{% endfor %}
{{ url }}
</ul>
{% endif %}
{% endfor %}
解决方案
你得到的是一个字节对象,你可以将它解码成一个字符串对象并ast.literal_eval()
用来将它转换成字典。然后将该字典传递到模板中。老实说,这是一个 JSON 对象,您不应该将其称为 HTML。我会在data
这里给它起名字。然后在模板中调用任何你想显示的内容:
from django.shortcuts import render
from .models import Carpark, Campus
from urllib.request import urlopen
import ast
def index(request):
campus_list = Campus.objects.all()
carpark_list = Carpark.objects.all()
noparking = Campus.objects.filter(carpark=None)
html = urlopen("https://mbezbradica.pythonanywhere.com/carparks/multi-storey").read()
data_string = html.decode("utf-8")
data = ast.literal_eval(test_string)
context = {'carpark_list': carpark_list,
'campus_list': campus_list,
'noparking': noparking,
'html' : data
}
return render(request, "parkatdcu/index.html", context)
在你的 html 文件中:
<h1>Welcome to ParkAtDCU</h1>
{% for campus in campus_list %}
<h2>
{{ campus }}
</h2>
{% if campus in noparking %}
No carparks found
{% else %}
<ul>
{% for carpark in carpark_list %}
{% if campus == carpark.campus_id %}
<li> {{ carpark.name }}: {{ carpark.spaces}} spaces, {{carpark.disabled_spaces}} spaces for people with disabilities, car park name: {{ html.carpark_name }}</li>
{% endif %}
{% endfor %}
{{ url }}
</ul>
{% endif %}
{% endfor %}
但是你这样做的方式非常肮脏(在我看来)。我建议你安装requests
和使用requests.get(url).json()
它会给你一个字典,而不用经历这个麻烦,让你的代码更干净(再次,在我看来)。您可以安装requests
:
pip install requests
并这样做:
from django.shortcuts import render
from .models import Carpark, Campus
from urllib.request import urlopen
import requests
def index(request):
campus_list = Campus.objects.all()
carpark_list = Carpark.objects.all()
noparking = Campus.objects.filter(carpark=None)
data = requests.get("https://mbezbradica.pythonanywhere.com/carparks/multi-storey").json()
context = {'carpark_list': carpark_list,
'campus_list': campus_list,
'noparking': noparking,
'html' : data
}
return render(request, "parkatdcu/index.html", context)
(我没有更改您的 html 上下文变量,因为“如果它有效,请不要触摸它”,我建议您将上下文变量名称“html”更改为“data”或类似的名称)。
推荐阅读
- python - 当我运行我的脚本时,我在 Pygame 中获得了大约 1 FPS。我的代码中是什么导致了这种情况?
- c++ - 运行时检查失败 - 变量周围的堆栈已损坏
- python - PyCharm 能否突出显示 Python 2 特定代码以启用迁移?
- arrays - 使用 lodash 键入错误以从对象数组创建唯一数组
- azure - 通过 azure 函数导出 cosmosDB 并将文件保存在 blob 存储中
- c# - iTextSharp 从内容 PDF C# 中获取操作
- ansible - 应用于包含指令和 with_items 时忽略角色标签
- python - 下载 Sceptre 时出错
- android - Flutter - 如何在点击时切换 RaisedButton 的颜色?
- java - 使用java的英语到西班牙语翻译