Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何访问flask中的view随机创建文件夹?_Python_Flask_Anki - Fatal编程技术网

Python 如何访问flask中的view随机创建文件夹?

Python 如何访问flask中的view随机创建文件夹?,python,flask,anki,Python,Flask,Anki,我在flask中实现了一个简单的应用程序。我可以获取数据并对其进行处理,但如何获取随机创建的文件夹呢。在这个应用程序中,我尝试向文本区域输入一些数据。单击export deck按钮后,数据将发布到烧瓶。我可以获取数据并生成deck,但无法发送生成的deck文件或重定向到random文件夹 我得到以下错误 raise TypeError( TypeError: The view function did not return a valid response. The function eithe

我在flask中实现了一个简单的应用程序。我可以获取数据并对其进行处理,但如何获取随机创建的文件夹呢。在这个应用程序中,我尝试向文本区域输入一些数据。单击export deck按钮后,数据将发布到烧瓶。我可以获取数据并生成deck,但无法发送生成的deck文件或重定向到random文件夹

我得到以下错误

raise TypeError(
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.)
那么,我如何实现这一点呢?重定向到新的随机生成文件夹或将生成的文件作为下载链接发送

谢谢

app.py

from flask import Flask, render_template, request, redirect, url_for, flash, send_file, send_from_directory
import image_occ_deck_export
import random, os

app = Flask(__name__)
app.config["CACHE_TYPE"] = "null"

@app.route("/", methods=["GET","POST"])
def home():
    if request.method == "POST":
        print(request.form['notes'])
        notes = request.form['notes']
        # random folder

        data = request.form['notes']
        print(data)

        random_f = random.randrange(1 << 30, 1 << 31)
        create_random_folder(random_f, data)

    else:
        return render_template("index.html")

        
def create_random_folder(random_f, data):
    directory = str(random_f)
    parent_dir = "static/uploads/"
    path = os.path.join(parent_dir, directory)

    if not os.path.exists(path):
        os.mkdir(path)

    random_file = directory + ".txt"
    random_deck_name = directory + ".apkg"


    file_loc = path + "/" + random_file

    deck_loc = path + "/" + random_deck_name

    with open(file_loc, 'w') as f:
        f.write(str(data))

    image_occ_deck_export.exportDeck(file_loc, deck_loc)

    return redirect(url_for('uploaded', path=path))

@app.route('/uploaded/<path>', methods=['GET'])
def uploaded():
    return render_template("upload.html")

if __name__ == "__main__":
    app.run(debug=False)
index.html

<html>
<textarea id="noteData"></textarea>
<button onclick="export()">Export Deck</button>
</html>

出口甲板
样本输入

cordova-img-occ-note-1602529000819      <img src='art-1851483_640.jpg'></img>   <img src='cordova-img-occ-ques-1602529000819.svg'></img>                        <img src='cordova-img-occ-ans-1602529000819.svg'></img> <img src='cordova-img-occ-orig-1602529000819.svg'></img>
cordova-img-occ-note-1602529001248      <img src='art-1851483_640.jpg'></img>   <img src='cordova-img-occ-ques-1602529001248.svg'></img>                        <img src='cordova-img-occ-ans-1602529001248.svg'></img> <img src='cordova-img-occ-orig-1602529000819.svg'></img>
cordova-img-occ-note-1602529001673      <img src='art-1851483_640.jpg'></img>   <img src='cordova-img-occ-ques-1602529001673.svg'></img>                        <img src='cordova-img-occ-ans-1602529001673.svg'></img> <img src='cordova-img-occ-orig-1602529000819.svg'></img>
cordova-img-occ-note-1602529000819
cordova-img-occ-note-1602529001248
cordova-img-occ-note-1602529001673
image\u occ\u deck\u export.py 用于从txt生成anki数据包的文件

import random
import genanki
import csv

import traceback

anki_deck_title = "learn"

anki_model_name = "image occ"

model_id = random.randrange(1 << 30, 1 << 31)

def exportDeck(data_filename, deck_filename):
   try:
        
      # front side
      front = """
{{#Image}}
<div id="io-header">{{Header}}</div>
<div id="io-wrapper">
<div id="io-overlay">{{Question Mask}}</div>
<div id="io-original">{{Image}}</div>
</div>
<div id="io-footer">{{Footer}}</div>

<script>
// Prevent original image from loading before mask
aFade = 50, qFade = 0;
var mask = document.querySelector('#io-overlay>img');
function loaded() {
var original = document.querySelector('#io-original');
original.style.visibility = "visible";
}
if (mask === null || mask.complete) {
loaded();
} else {
mask.addEventListener('load', loaded);
}
</script>
{{/Image}}

"""

      style = """
/* GENERAL CARD STYLE */
.card {
font-family: "Helvetica LT Std", Helvetica, Arial, Sans;
font-size: 150%;
text-align: center;
color: black;
background-color: white;
}

/* OCCLUSION CSS START - don't edit this */
#io-overlay {
position:absolute;
top:0;
width:100%;
z-index:3
}

#io-original {
position:relative;
top:0;
width:100%;
z-index:2;
visibility: hidden;
}

#io-wrapper {
position:relative;
width: 100%;
}
/* OCCLUSION CSS END */

/* OTHER STYLES */
#io-header{
font-size: 1.1em;
margin-bottom: 0.2em;
}

#io-footer{
max-width: 80%;
margin-left: auto;
margin-right: auto;
margin-top: 0.8em;
font-style: italic;
}

#io-extra-wrapper{
/* the wrapper is needed to center the
left-aligned blocks below it */
width: 80%;
margin-left: auto;
margin-right: auto;
margin-top: 0.5em;
}

#io-extra{
text-align:center;
display: inline-block;
}

.io-extra-entry{
margin-top: 0.8em;
font-size: 0.9em;
text-align:left;
}

.io-field-descr{
margin-bottom: 0.2em;
font-weight: bold;
font-size: 1em;
}

#io-revl-btn {
font-size: 0.5em;
}

/* ADJUSTMENTS FOR MOBILE DEVICES */

.mobile .card, .mobile #content {
font-size: 120%;
margin: 0;
}

.mobile #io-extra-wrapper {
width: 95%;
}

.mobile #io-revl-btn {
font-size: 0.8em;
}

"""

      # back side
      back = """
{{#Image}}
<div id="io-header">{{Header}}</div>
<div id="io-wrapper">
<div id="io-overlay">{{Answer Mask}}</div>
<div id="io-original">{{Image}}</div>
</div>
{{#Footer}}<div id="io-footer">{{Footer}}</div>{{/Footer}}
<button id="io-revl-btn" onclick="toggle();">Toggle Masks</button>
<div id="io-extra-wrapper">
<div id="io-extra">
{{#Remarks}}
<div class="io-extra-entry">
<div class="io-field-descr">Remarks</div>{{Remarks}}
</div>
{{/Remarks}}
{{#Sources}}
<div class="io-extra-entry">
<div class="io-field-descr">Sources</div>{{Sources}}
</div>
{{/Sources}}
{{#Extra 1}}
<div class="io-extra-entry">
<div class="io-field-descr">Extra 1</div>{{Extra 1}}
</div>
{{/Extra 1}}
{{#Extra 2}}
<div class="io-extra-entry">
<div class="io-field-descr">Extra 2</div>{{Extra 2}}
</div>
{{/Extra 2}}
</div>
</div>

<script>
// Toggle answer mask on clicking the image
var toggle = function() {
var amask = document.getElementById('io-overlay');
if (amask.style.display === 'block' || amask.style.display === '')
amask.style.display = 'none';
else
amask.style.display = 'block'
}

// Prevent original image from loading before mask
aFade = 50, qFade = 0;
var mask = document.querySelector('#io-overlay>img');
function loaded() {
var original = document.querySelector('#io-original');
original.style.visibility = "visible";
}
if (mask === null || mask.complete) {
loaded();
} else {
mask.addEventListener('load', loaded);
}
</script>
{{/Image}}
"""
      
      # print(self.fields)
      anki_model = genanki.Model(
          model_id,
          anki_model_name,
          fields=[{"name": "id"},{"name": "Header"}, {"name": "Image"}, {"name": "Question Mask"}, {"name": "Footer"}, {"name": "Remarks"}, {"name": "Sources"}, {"name": "Extra 1"}, {"name": "Extra 2"}, {"name": "Answer Mask"}, {"name": "Original"}],
          templates=[
              {
                  "name": "Card 1",
                  "qfmt": front,
                  "afmt": back,
              },
          ],
          css=style,
      )

      anki_notes = []

      with open(data_filename, "r", encoding="utf-8") as csv_file:
          csv_reader = csv.reader(csv_file, delimiter="\t")
          for row in csv_reader:
              flds = []
              for i in range(len(row)):
                  flds.append(row[i])

              anki_note = genanki.Note(
                  model=anki_model,
                  fields=flds,
              )
              anki_notes.append(anki_note)

      random.shuffle(anki_notes)

      anki_deck = genanki.Deck(model_id, anki_deck_title)
      anki_package = genanki.Package(anki_deck)

      for anki_note in anki_notes:
          anki_deck.add_note(anki_note)

      
      anki_package.write_to_file(deck_filename)

      print("Deck generated with {} flashcards".format(
          len(anki_deck.notes)))

   except Exception:
       traceback.print_exc()
随机导入
进口genanki
导入csv
导入回溯
anki_deck_title=“学习”
anki_model_name=“图像occ”
model_id=random.randrange(1
create_random_folder()
返回重定向,但是当您从
home()
请求处理程序调用它时,您不会对返回的值做任何处理,也不会在
home()的代码分支中返回响应
handler。似乎您打算从
home()返回重定向,如下所示:

return create_random_folder(random_f, data)

请记住,当您从函数返回值时,您将值返回给调用代码,而不是浏览器。如果您从请求处理程序调用函数并收到返回值,则不会自动发送回浏览器;您需要从请求处理程序返回它。

谢谢,它可以工作。但它不是重定向我必须手动复制并粘贴随机url,然后重定向到
upload.html
。但是当单击按钮时,没有重定向。需要帮助。再次感谢。您正在发出Ajax请求。重定向响应由您的Ajax代码处理,而不是由浏览器处理。如果您希望页面本身更改,为什么要使用带有点击处理程序的按钮,而不是链接或表单帖子?好的,理解。谢谢
return create_random_folder(random_f, data)