错误:root:MiniFieldStorage - 在httpSimpleServer上运行Python和Flask的问题

时间:2017-02-26 22:36:28

标签: python http flask

我正在运行一个带有自定义httpSimpleServer的小型Python应用程序,以适应“POST”方法。

应用程序应该将输入到表单中的字符串的所有字母大写并返回它们。

我在终端上收到一个错误,我用谷歌搜索无效,我需要更改才能让这个应用程序正常工作?

的index.html

<!DOCTYPE html>
<html lang="en">
<body>
    <h1>Enter some text</h1>
    <h2>(it will be converted to uppercase)</h2>
    <form action="." method="POST" name="text">
        <input type="text">
        <input type="submit" name="my-form" value="Send">
    </form>
</body>
</html>

flask_app.py

from flask import Flask
from flask import request
from flask import render_template

app = Flask(__name__)

@app.route('/')
def my_form():
    return render_template("templates/index.html")

@app.route('/', methods=['POST'])
def my_form_post():
    text = request.form.index.html
    processed_text = text.upper()
    return processed_text

if __name__ == '__main__':
    app.debug = True
    app.run()

SimpleServer.py

import SimpleHTTPServer
import SocketServer
import logging
import cgi
import cgitb

cgitb.enable()

PORT = 8000

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):

def do_GET(self):
    logging.error(self.headers)
    SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

def do_POST(self):
    logging.error(self.headers)
    form = cgi.FieldStorage(
        fp=self.rfile,
        headers=self.headers,
        environ={'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE':self.headers['Content-Type'],
                 })
    for item in form.list:logging.error(item)
    SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)


Handler = ServerHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

终端错误消息

ERROR:root:Host: localhost:8000
Connection: keep-alive
Content-Length: 12
Cache-Control: max-age=0
Origin: http://localhost:8000
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3)          
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost:8000/templates/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: Pycharm-2c79b07b=b4744dcc-07ae-4e39-9d94-06d7a2fcf11c

ERROR:root:MiniFieldStorage('my-form', 'Send')
127.0.0.1 - - [26/Feb/2017 22:11:21] "POST /templates/ HTTP/1.1" 200 -

2 个答案:

答案 0 :(得分:0)

关于SimpleServer.py

ERROR:root:MiniFieldStorage('my-form', 'Send')

不是错误 - 只是记录提交表单的内容。因为您正在调用logging.error(),所以该消息的前缀为“ERROR:root”。

您可以使用logging.debug()代替首先在文件顶部附近添加此行

logging.basicConfig(level=logging.DEBUG)

设置日志级别,并将来电从logging.error()更改为logging.debug()

index.html中的HTML表单也存在问题;它有一个未命名的字段<input type="text">。如果您希望浏览器提交该字段,则必须进行命名,例如

<input type="text" name="phrase">

如果您现在登顶表单,您会看到它出现在您的日志记录中。

现在,转到Flask应用程序,这一行:

text = request.form.index.html

会导致您遇到问题,因为这不是您访问已发布表单中字段的方式。试试这个:

text = request.form.get('phrase', '')

这将从表单中获取名为"phrase"的字段的值(它是字典查找)。如果未设置该字段,则该值将默认为空字符串 - 这提供了一些容错功能。

答案 1 :(得分:0)

请检查此代码。

<强>的index.html

<!doctype><html><meta charset="utf-8"><form id="form" method="post">
<label>First Name  </label>
<input type="text" name="firstname" id="firstname" /><br><br>
<input type="submit" name="submit" id= "submit"/></form><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script><script>var API_URL = 'http://' + location.host;$("#submit").click(function(){
var f = $("#firstname").val();
var form_data = new FormData();
form_data.append('firstname', f);
$.ajax({
    url: API_URL,
    type : "POST",
    contentType: false,
    processData: false,
    dataType : 'json',
    data : form_data,
    success : function(result) {
        console.log(result);},
    error: function(xhr, resp, text) {
        console.log(xhr, resp, text);
    }})});</script></html>

<强> server.py

import os
from flask import Flask, render_template, jsonify, request
import json


__author__ = 'Rajshekhar Horatti'
app = Flask(__name__)
APP_ROOT = os.path.dirname(os.path.abspath(__file__))

@app.route("/")
def main():
    return render_template("index.html")


@app.route("/", methods=['POST'])
def Createdata():
    target = os.path.join(APP_ROOT)
    firstname = request.form['firstname']
    data = firstname.upper()
    return data


if __name__ == "__main__":
    app.run(host='localhost', port=8080, debug=True)