未找到 GAE Web 表单图像(使用 Python 和 jinja2)

Posted

技术标签:

【中文标题】未找到 GAE Web 表单图像(使用 Python 和 jinja2)【英文标题】:GAE Web Form Image not found (Using Python and jinja2) 【发布时间】:2021-04-26 06:13:34 【问题描述】:

TL;DR:图像按钮响应点击,但在 App Engine 上部署应用时不显示图像。


我有一个 python 脚本,它显示一个 web 表单以响应 http 请求。该表单包含几个图像按钮。 Python 代码可以很好地显示表单本身,但按钮图像显示带有断开链接图标的空白方块(见下文)。

如果我单击其中一个空白方块,则会将响应发送回 Ok 到服务器,因此按钮方面是 Ok。 另外,如果我在文件资源管理器中双击 html 模板文件,它会显示正确显示的图像按钮,因此 html 在这个意义上是“有效的”)。

我尝试将 html 模板和图像文件放在应用程序根目录和模板子目录中,并得到相同的结果,以及我能想到的几乎所有其他内容,但没有运气。我也尝试过将图像作为jpg文件以及原始png再次尝试,没关系。

下面的代码等。我已经尝试搜索这个问题,并得到了很多与此相关的帖子,但似乎没有一个完全相关 - 它们更多地与存储在 blob 存储或其他谷歌存储中的图像有关,而不是作为应用程序文件。

我在下面给出了原始、最简单的代码版本等以及应用程序根目录中的所有文件。我实际上更喜欢将 html 和图像文件放在模板文件夹中,但这也不起作用。 (代码在两个模块中,因为这实际上是更大的整体应用程序的一部分,但我认为最好隔离与此问题相关的代码)

主模块处理GET请求

import SailsTestSpin
class sails_spin(webapp2.RequestHandler):
    def get(self):
            SailsTestSpin.sails_spin_pick(self)

SailsTestSpin.py

def sails_spin_pick(handler):
    logging.info("sails_spin_pick: begin ...")
    page = "sails_test_spin3.html"
    ##template_dir = os.path.join(os.path.dirname(__file__), 'templates')
    template_dir = os.path.join(os.path.dirname(__file__))
    logging.info("... template dir: "+str(template_dir))
    
    jinja_env = jinja2.Environment(loader =
                   jinja2.FileSystemLoader(template_dir), autoescape=True)
    template = jinja_env.get_template(page)
    logging.info("... template: "+str(template))
    
    render = template.render()
    logging.info("... render: "+rebder)
    handler.response.out.write(render)

    #this didn’t work either
    #img1 = os.path.join(template_dir, "spin-glasses3.png")
    #img2 = os.path.join(template_dir, "spin-spiral3.png")
    #logging.info("... img1: "+img1)
    #render = template.render(
                        'image1': img1,
                        'image2': img2
                        )
    #logging.info("... render: "+render)
    #handler.response.out.write(render)

sails_test_spin3.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head>
<style type="text/css">
h1  font-family: Cambria; font-size:32pt; color:SteelBlue; text-align:center; margin:0;
a  font-family: Cambria; font-size:14pt; color:DarkBlue; font-weight:bold; line-height:135%; margin-top:28px; margin-bottom:15px; margin-left:5; margin-right:5
</style>
<script type="text/javascript">
function goTop()

window.location.assign("#Top")

</script><title>J Class Spinnaker</title>

</head>
<body style="" lang="EN-CA" link="SteelBlue" vlink="moccasin">
<h1>J Class Customiser - Spinnaker Selection ... [3]</h1> 
<br>
<form action="/sails_spin_set" method="post">
<input name="parm1" value="Button1" style="font-size: 12pt; color: Navy; font-weight: bold;"type="image" src="spin-glasses3.jpg"  >
<input name="parm1" value="Button2" style="font-size: 12pt; color: Navy; font-weight: bold;"type="image" src="spin-spiral3.jpg"  >
<br>
<br>
<input name = "parm1" value="Cancel" style="font-size: 16pt; color: DarkRed; font-weight: bold;" type="submit"> 
</form>
</body></html>

app.yaml

runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /bootstrap
  static_dir: bootstrap

- url: /.*
  script: sails_test_server.app

- url: /.*
  script: SailsTest.py
  
- url: /.*
  script: emailer2.pyc
  
 # [START libraries]
libraries:
- name: webapp2 
  version: latest
- name: jinja2
  version: latest
- name: ssl
  version: 2.7.11
# [END libraries]

application directory相关文件在底部

结果

Expected result

Actual result

page file info

PS:请不要对图像是否适合大三角帆提出意见,这个故事太长了 - 简短的版本涉及虚拟这个词!

【问题讨论】:

这能回答你的问题吗? Static image folder with google app engine 【参考方案1】:

App Engine 不会直接从应用程序的源目录中提供文件,除非配置为这样做。您必须通过 app.yaml 配置您的应用以使用静态文件。

一种解决方案是创建一个目录(例如images),然后将您的按钮图像移动到该目录。然后,在你的 app.yaml 中添加这个 URL 处理程序:

- url: /(.*\.(jpg|png))
  static_files: images/\1
  upload: images/(.*\.(jpg|png))

或者您可以关注文档并使用static_dir,因为您更喜欢将图像文件放在模板文件夹中。在这种情况下,您必须重命名 HTML 文件中的图像 src:

<input name="parm1" value="Button1" style="font-size: 12pt; color: Navy; font-weight: bold;"type="image" src="templates/images/spin-glasses3.jpg"  >
<input name="parm1" value="Button2" style="font-size: 12pt; color: Navy; font-weight: bold;"type="image" src="templates/images/spin-spiral3.jpg"  >

然后在你的 app.yaml 上使用这个处理程序:

- url: /templates
  static_dir: templates

参考:https://cloud.google.com/appengine/docs/standard/python/getting-started/serving-static-files

【讨论】:

非常感谢。我尝试的其中一件事是将图像以及 html 移动到模板中;然后问题是模板文件'找不到'' - 我尝试了所有我能想到的将 Jinja 指向模板文件夹但没有奏效的方法。我将尝试将模板留在原处并仅移动图像。你的第二种方法似乎更干净(对我来说)。 @RFlack 我能够使用您提供的详细信息使其工作,因此如果您需要澄清,请告诉我。 我也是 --- 我正在投票和接受!我们还没有尝试移动 html;但将图像与其他图像放在一起效果很好。 这个问题***.com/questions/41685729/… 已被提议作为回答我的问题。我的回答是“不完全正确”——我认为这里的解决方案更具体,我已经接受了这个答案。我不确定是否应该回答“是”或“否”来回答另一个问题是否回答了我的问题?我不太确定接受另一个问题有什么作用? @唐纳德-谢谢!我已经接受了建议的 TL;DR 在顶部。我不确定它是否有点过于简化,因为按钮在那里(即响应点击)它只是没有显示图像。

以上是关于未找到 GAE Web 表单图像(使用 Python 和 jinja2)的主要内容,如果未能解决你的问题,请参考以下文章

如果未使用 C# 登录 ASP.NET Web 表单,则将用户重定向到登录

使用 Flask (python) 从 GAE 数据存储中提供图像

GAE - 在服务器端获取图像宽度和高度

未找到 Lexik JWT 令牌

为啥图像名称未显示在表单字段中以进行更新?

CSS和图像未加载