Python + Flask ..我缺少什么?

时间:2019-12-17 15:22:30

标签: python flask

我是python和flask的新手,但我想学习并需要您的帮助。

我有一个python脚本和一个mongoDB实例。 现在,有了flask,我想在一个网页上列出数据库中的所有项目,并使用另一个网页来触发脚本来添加其他项目。

但是每次我在“ /添加”页面上单击“提交”时,都会出现“不允许使用方法”,并且可以看到它试图将其提交到“ /”而不是“ /添加”。 / p>

script.py

from flask import Flask, render_template, request
import requests, json, sys, getopt, smtplib
from os import system, name
from pathlib import Path
from pymongo import MongoClient

client = MongoClient(port = 27017)
db = client.amazonProducts
allitems = []
allMyItems = []
for document in db.items.find():
  allitems.append(document["name"])

def addItem():
    for dbWishList in db.wishlist.find():
        url = dbWishList["wishlist"]
    items = json.loads(requests.get(url).text)

    if items:

        for item in items:
            itemName = str(item["name"])
            itemPrice = item["new-price"]
            itemUrl = str(item['link'])
            if itemPrice:
                itemPrice = str(itemPrice[26: ])
                itemPrice = str(itemPrice[: itemPrice.find("<")])
                itemPriceF = str(itemPrice.replace(".", ""))
                itemPriceF = str(itemPriceF.replace("€", ""))
                itemPriceF = str(itemPriceF.replace("\xa0", ""))
                itemPriceF = str(itemPriceF.replace(",", ".")).replace("\xf6", "")
                itemPriceFi = float(itemPriceF)
                itemUrl = itemUrl[: itemUrl.find("?coliid")]
                itemNameF = itemName.replace('&quot;', '"')
                itemNameFi = itemNameF.replace("&amp;amp;", "&")
                itemNameFi = itemNameFi.replace("&uuml;", "ue").replace("&ouml;", "oe").replace("&auml;", "ae").replace("&nbsp;", " ").replace("&ndash;", "-")

            amazonItem = {
                'name': itemNameFi,
                'url': itemUrl,
                'price': itemPriceFi,
                'maxPrice': 0
            }

            db.items.insert_one(amazonItem)

        for document in db.items.find():
            allMyItems.append(document["name"])
        return allMyItems

app = Flask(__name__)

@app.route('/')
def homepage():

  return render_template("index.html", len = len(allitems), allitems = allitems)

app.run(use_reloader = True, debug = True)

app.config["DEBUG"] = True
@app.route("/add", methods = ["GET", "POST"])
def secPage():

    errors = ""
    if request.method == "POST":
        global testingVar
        testingVar = None

        try:
            testingVar = string(request.form["testingVar"])
        except:
            errors += "<p>{!r} is not a string.</p>\n".format(request.form["testingVar"])
        if testingVar is not None:
            addItem()
        return render_template("secIndex.html", len = len(allMyItems), allMyItems = allMyItems)
    return '''
        <html>
            <body>
                {errors}
                <p>What you wanna do?:</p>
                <form method="post" action=".">
                    <p><input name="testingVar" /></p>
                    <p><input type="submit" value="Do magic" /></p>
                </form>
            </body>
        </html>
    '''.format(errors=errors)

index.html

<!DOCTYPE html> 

<html> 
    <head> 
        <title>For loop in Flask</title> 
    </head> 
    <body> 

        <ul> 
        <!-- For loop logic of jinja template -->
        {%for i in range(0, len)%} 

            <li>{{allitems[i]}}</li> 
        {%endfor%} 

        </ul> 

    </body> 
</html> 

secIndex.html

<!DOCTYPE html> 

<html> 
    <head> 
        <title>For loop in Flask</title> 
    </head> 
    <body> 

        <!-- For loop logic of jinja template -->
        <form method="post" action=".">
            <p><input name="testingVar" /></p>
            <p><input type="submit" value="Do magic" /></p>
        </form>


    </body> 
</html> 

项目的构建方式如下:

amazonItem = {
    'name': itemNameFi,
    'url': itemUrl,
    'price': itemPriceFi,
    'maxPrice': 0
}

这里有人可以跟我说我的错误可能在哪里吗?

先谢谢!

1 个答案:

答案 0 :(得分:0)

在表单定义中,您具有:

<form method="post" action=".">

action属性需要具有要将发布请求发送到的端点。根据您的情况,

<form method="post" action="/add">

如果省略action属性,它将把发帖请求提交到当前页面,因此,如果您从/add查看表单,则可以使用

<form method="post">