Bad request error when chosing file on server with form

孤者浪人 提交于 2019-12-08 13:03:26

问题


from flask.ext.wtf import Form
from flask import send_from_directory
from wtforms import StringField, BooleanField
from wtforms import SelectField

import os
from os import listdir
from os.path import isfile, join

crewPath =  ("/myproject/app/static/Crews")

filenamesCrew = [f for f in listdir(crewPath) if isfile(join(crewPath,f)) ]

class userInput(Form):
    json_fileCrew = SelectField(u"json_fileCrew", choices=[(f, f) for f in filenamesCrew])

    def get_data(self):
        json = send_from_directory (crewPath, self.json_fileCrew.data)
        return json

@app.route('/CastCrew', methods=['GET', 'POST'])
def castCrew():
    form = userInput(request.form["crewYear"])
    return render_template('CastCrew.html', title = 'Cast Crew View', form = form)

@app.route("/data", methods=['GET', 'POST']) #the javascript will call this
def data():
    form = userInput(request.form["crewYear"])
    return form.get_data()
<form class = "form" action="/data" method="post" name="crewYear">
    {{ form.hidden_tag() }} <!--CSFR config -->
    <p>Please choose a year:<br>
    {{ form.json_fileCrew }}<br></p>
    <p><input type="submit" value="Submit"></p>
</form>

I am getting a "Bad Request" error when I submit the form. How do I fix this?

The layout of project files:

---app
        ---views.py
        ---forms.py
        ---static
               ---Crews (about 100 .json files in this folder)
                     ---1981.json
               ---css
               ---js
        ---templates
             ---base.html
             ---crew.html

I modified code according answer below but I still get a 404 Not Found Error when I click the button.


回答1:


The immediate problem is that you're passing the value of request.form["crewYear"] to your form, rather than the entire request.form.


There are a lot of minor problems with your code. You don't need to use send_from_directory, since there's a more specific function to send from the static directory. You should populate the select field in the form init, otherwise it will not reflect any files added after the app starts. You should use app.static_folder rather than hard coding the path. You have two routes that do the same thing.

import os
from flask import current_app
from flask_wtf import Form
from wtforms.field 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)

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

    if form.validate_on_submit():
        return current_app.send_static_file('Crews/{}'.format(form.filename.data))

    return render_template('crew.html', form=form)
<form method="post">
    {{ form.hidden_tag() }}
    {{ form.filename }}
    <input type="submit" value="Get Data"/>
</form>

Consider reading the Flask tutorial and Flask-WTF docs, as they clearly explain how to use forms. Reading PEP 8 would also be beneficial, as your code style is very inconsistent.



来源:https://stackoverflow.com/questions/30379160/bad-request-error-when-chosing-file-on-server-with-form

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!