Рендеринг локальных веб-страниц в виде iFrame в Django
У меня есть представление, которое загружает zip-файл, проверяет, содержит ли он файл index.html, и распаковывает его в определенную папку в статическом каталоге. Я хочу иметь возможность просмотреть это, перейдя на страницу, где есть iFrame, указывающий на эту директорию, и пользователь сможет перемещаться внутри этой html-страницы. Но я не могу заставить это работать.
Вот функция, которая загружает zip-файл, и представление, которое ее использует:
views.py:
@user_passes_test(lambda u: u.is_staff or u.is_superuser)
def createCategory(request):
if request.method == "POST":
name = request.POST.get("name_kw")
lang = request.POST.get("lang_kw")
moduleid = request.POST.get("module_kw")
zip = request.FILES.get("zip_kw")
category = Category()
category.name = name
category.lang = lang
category.module = Module.objects.get(id=moduleid)
category.zip = zip
category.created_by = request.user
try:
if zip.name.endswith(".zip"):
rtn = publish_doc(category.name, zip)
if rtn == "No index file found":
messages.error(
request,
"Pas de fichier index.html détecté. Assuez-vous qu'un fichier index.html est présent dans votre fichier ZIP",
)
return redirect("categoryList")
else:
category.root = rtn
category.save()
messages.success(request, "Catégorie créée avec succès")
print("categorie et zip créées")
return redirect("categoryList")
else:
messages.error(
request,
"Seuls les fichiers .ZIP sont acceptés",
)
return redirect("categoryList")
except IntegrityError:
print("erreuuuuuuuur")
messages.error(
request,
"Une erreur s'est produite. Veuillez réessayer plutard, ou contacter notre équipe technique.",
)
context = {
"page_title": "Créer une catégorie",
"modulelist": Module.objects.all(),
}
return render(request, "main/category/add_category.html", context)
utils.py:
def publish_doc(catg_name, zip):
# create folder in machine
# path = os.path.join(settings.STATIC_ROOT, catg_name)
path = f"{settings.STATIC_ROOT}/{catg_name}"
try:
os.mkdir(path)
except OSError as error:
print(error)
print("Directory '% s' created" % path)
# check if contents have an index html file
zipObj = ZipFile(zip, "r")
if "index.html" in zipObj.namelist():
zipObj.extractall(path)
# return root path
return path
else:
return "No index file found"
settings.py:
X_FRAME_OPTIONS = 'SAMEORIGIN'
STATIC_URL = "/static/"
STATIC_ROOT = "/documenter/site/public/static"
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
html-код:
<iframe id="serviceFrameSend" src="/static/{{ catg.root }}" width="100%" height="1000" class="p-2" frameborder="0">
Когда я посещаю страницу, она выдает ошибку 500 (см. скриншот).