Flask WTForm SelectField产生404错误

时间:2015-05-22 11:56:43

标签: python flask http-status-code-404 wtforms

我花了好几个小时就不知道为什么我会收到404错误。我会尽量保持清醒。 这是我的文件夹结构。

project-->
       run.py
       app-->
            forms.py
            views.py
            templates-->
                       Crew.html
            static-->
                    Crews-->
                            1901.json
                            1902.json
                            1903.json

在forms.py中,这是表单的创建和填充方式

    import os
from flask import current_app
from flask_wtf import Form
from wtforms import SelectField


class CrewForm(Form):
    filename = SelectField()

    def __init__(self, *args, **kwargs):
        root = os.path.join(current_app.static_folder, 'Crews')
        choices = [(f, f) for f in os.listdir(root) if os.path.isfile(os.path.join(root, f))]
        self.filename.kwargs['choices'] = choices
        super(CrewForm, self).__init__(*args, **kwargs)

在views.py中,这是@ app.route

@app.route('/CastCrew', methods=['GET', 'POST'])
def crew():
    form = CrewForm()

    if form.validate_on_submit():
        return current_app.send_static_file(os.path.join('Crews', form.filename.data))

    return render_template('Crew.html', form=form)

在Crew.html中,这就是表单的创建方式

<form method="post">
  {{ form.hidden_tag() }} <!--CSFR config -->
      Please choose a year:<br>
      {{ form.filename }}<br>

我有调用/ CastCrew函数来接收数据的javascript代码,

d3.json("/CastCrew", function(error, graph) {

当我选择一年,然后按提交时,在cmd提示符中我收到此错误 - POST /CastCrew HTTP/1.1 404-

在网页上我收到此错误

Not Found The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

如果表单填写正确,为什么我会收到404错误?任何帮助将不胜感激。

我在网络控制台中收到此错误消息

The character encoding of the HTML document was not declared. The `document will render with garbled text in some browser configurations if the document contains characters from outside the US-ASCII range. The character encoding of the page must be declared in the document or in the transfer protocol.`

run.py

from app import app
app.run(debug=True)

print(app.url_map)添加到run.py的结尾并获得此

    * Restarting with reloader
Map([<Rule '/CastCrew' (HEAD, POST, OPTIONS, GET) -> crew>,
 <Rule '/index' (HEAD, OPTIONS, GET) -> index>,
 <Rule '/about' (HEAD, OPTIONS, GET) -> about>,
 <Rule '/data' (HEAD, POST, OPTIONS, GET) -> data>,
 <Rule '/' (HEAD, OPTIONS, GET) -> index>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])

这个问题被标记为重复,并链接到我问过的上一个问题 - 它是不同的,因为它是由另一个用户编辑的,因为另一个问题出现了,使它与众不同。

3 个答案:

答案 0 :(得分:1)

如果 您使用的是Windows,我认为您的主要问题是缺少/个字符

在这一行

return current_app.send_static_file(os.path.join('Crews', form.filename.data))

在Windows上,os.path.join('Crews', form.filename.data)将创建一个带有Windows分隔符的路径,即Crews\<filename>.json,然后以主机名为前缀。但是,您需要一个URL样式子路径,即Crews/<filename>.json

您应该使用文件名加入Crews/,而不是Crews。 404告诉你它无法找到要返回的文件(因为路径无效)。可能还有其他错误,因为我们不知道run.py等的完整设置。

请尝试使用此行

return current_app.send_static_file(os.path.join('Crews/', form.filename.data))

答案 1 :(得分:0)

在我看来,至少部分问题可能是缩进。你有:

@app.route('/CastCrew', methods=['GET', 'POST'])
def crew():
    form = CrewForm()

if form.validate_on_submit():
    return current_app.send_static_file(os.path.join('Crews', form.filename.data))

return render_template('Crew.html', form=form)

应该是:

@app.route('/CastCrew', methods=['GET', 'POST'])
def crew():
    form = CrewForm()

    if form.validate_on_submit():
        return current_app.send_static_file(os.path.join('Crews', form.filename.data))

    return render_template('Crew.html', form=form)

使用crew()函数中的表单提交代码。

答案 2 :(得分:0)

你需要使用javascripts吗?

我修改了你的代码,它对我来说很好。

Crew.html

<form method="post">
   {{ form.hidden_tag() }} <!--CSFR config -->
   Please choose a year:<br>
   {{ form.filename }}<br>
   <input type="submit">
</form>

Views.py

from app import app

@app.route('/CastCrew', methods=['GET', 'POST'])
   def crew():
      form = CrewForm()
      if form.validate_on_submit():
         return app.send_static_file(os.path.join('Crews', form.filename.data))
      return render_template('Crew.html', form=form)

如果这没有帮助,您需要更好地追踪问题。未找到错误表示文件未位于您认为的位置。添加一些日志记录或打印件,帮助您找到导致崩溃的行。