Pyqrcode不能使用Flask蓝图

时间:2016-12-13 10:50:39

标签: python flask


我刚刚开始研究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的情况下运行良好... 在此先感谢您的任何帮助

2 个答案:

答案 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