我刚刚开始研究python和flask。我的问题可能看似简单或愚蠢,但我确实处于僵局状态。在不了解当前代码行为的情况下,我无法进一步学习。
这是我的问题。
我的项目中有非常奇怪的代码行为。我的一个培训flask.app从用户输入生成qr代码。生成代码后,用户可以选择:获取png上的链接或直接下载文件。这个应用效果很好。
后来,我决定从我的小型培训应用程序中设置蓝图,第一个是qr-generator。我刚刚复制了qr-gen路由的功能,但它不能很好地工作 - qr无法保存png,我收到错误后,点击按钮获取链接或下载:
FileNotFoundError:[Errno 2]没有这样的文件或目录: ' TMP / 201612131254.png'
这是层次结构:
├── app.py
├── blueprints
│ ├── __init__.py
│ ├── qr_generator
│ │ ├── __init__.py
│ │ ├── forms.py
│ │ ├── templates
│ │ │ ├── macros
│ │ │ │ └── render_field.html
│ │ │ └── qr_request.html
│ │ ├── tmp
│ │ └── view.py
│ └── tmp
├── config.py
├── static
├── templates
│ └── _base_template.html
├── tmp
└── views.py
这是 app.py :
from flask import Flask, render_template
import config
from blueprints.qr_generator.view import qr_view
app = Flask(__name__)
app.config.from_object(config)
app.register_blueprint(qr_view)
@app.route('/')
def home():
return render_template(
'_base_template.html'
)
if __name__ == '__main__':
app.run()
Blueprint qr-generator view.py :
import datetime
from flask import Blueprint, request, render_template, send_from_directory, redirect
from pyqrcode import QRCode
from blueprints.qr_generator.forms import UserTextField
# Blueprint
qr_view = Blueprint('qr_view', __name__, template_folder='templates')
# Views:
@qr_view.route('/qr_view', methods=['GET', 'POST'])
def qr_generator():
qr_file_name = None
if request.method == 'POST':
form = UserTextField(request.form)
if form.validate():
qr_code = QRCode(form.data['text'], encoding='utf-8')
qr_file_name = 'tmp/' + datetime.datetime.now().strftime('%Y%m%d%H%M') + '.png'
qr_code.png(qr_file_name, scale=5)
if form.data['mode'] == 'download':
return redirect(qr_file_name)
else:
form = UserTextField()
return render_template(
'qr_request.html',
form=form,
link=qr_file_name,
)
@qr_view.route('/tmp/<path:qr_path>')
def show_qr(qr_path):
return send_from_directory('tmp', qr_path, as_attachment=True)
qr_request.html :
{% extends '_base_template.html' %}<html lang="en">
{% block content %}
<div class="content">
{% from "macros/render_field.html" import render_field %}
<form method="POST" action="{{ url_for('qr_view.qr_generator') }}">
{{ form.hidden_tag() }}
<dl>
{% for field in form %}
{% if field.id != 'csrf_token' %}
{{ render_field(field) }}
{% endif %}
{% endfor %}
</dl>
<input type="submit" value="{{ 'Submit' }}" class="btn">
</form>
<div class="link">
{% if link %}
<p>Your QRCode is <a href="{{ link }}">here</p>
{% endif %}
</div>
</div>
{% endblock %}
相同的代码在没有Blueprint的情况下运行良好... 在此先感谢您的任何帮助
答案 0 :(得分:0)
您需要指定文件的绝对路径。请尝试以下代码来创建文件路径
os.path.abspath('tmp/' + datetime.datetime.now().strftime('%Y%m%d%H%M') + '.png')
答案 1 :(得分:0)
我认为你必须确保你的文件路径是正确的。我通常在我的配置中设置一个BASEPATH
对应用程序目录是绝对的,所以我总是得到qr-code的正确路径。
import os
basedir = os.path.abspath(os.path.dirname(__file__))
QRCODE_FOLDER = os.path.join(basedir, "blueprints/qr_generator/tmp/")
其他选项是让您的溃败程序动态返回图像,而不将其保存到磁盘。
这样的事情(来自我的应用):
@app.route('/parts/qrcode/<int:id>', methods=['GET'])
def generate_qrcode(id):
part = Part.query.get(id)
data = "flaskparts://%i" % part.id
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image()
img_io = StringIO.StringIO()
img.save(img_io, 'PNG')
img_io.seek(0)
response = make_response(img_io.read())
response.headers['Content-Type'] = 'image/png'
response.headers['Content-Description'] = 'attachment; filename=%i.png' % id
return response