2016-12-13 78 views
1


我剛開始學習python和flask。我的問題可能看起來簡單或愚蠢,但我真的處於僵局。如果不理解當前的代碼行爲,我無法進一步學習。 這是我的問題。
我的項目中有非常奇怪的代碼行爲。我的一個培訓flask.app從用戶輸入生成qr代碼。生成代碼後,用戶可以選擇:在png上獲取鏈接或直接下載文件。這個程序運行良好。
稍後,我決定從我的小型培訓應用程序製作藍圖,第一個是qr生成器。我剛剛複製的QR根路徑的功能,但它不能很好地工作 - QR不能保存PNG,我收到了錯誤,點擊按鈕後,獲得鏈接或下載:Pyqrcode將無法使用Flask藍圖

FileNotFoundError: [Errno 2] No such file or directory: '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() 

藍圖QR發電機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 %} 

相同的代碼工作良好,沒有藍圖...... 預先感謝任何幫助

回答

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 
+1

似乎問題出在pycharm ..如果我通過控制檯啓動應用程序,QR保存在/ tmp中的png,用戶可以下載它。根據Blueprints概念,我想將藍圖中的png文件保存爲** qr_generator **。當我更改代碼 - 'qr_file_name ='blueprints/qr_generator/tmp /'+ datetime.datetime.now()。strftime('%Y%m%d%H%M')+'.png'我得到新文件到'blueprints/qr_generator/tmp /'文件夾中,但用戶無法獲得qr-code - 找不到文件'http://127.0.0.1:5000/blueprints/qr_generator/tmp/201612131800.png' – kotmsk

0

你需要指定的絕對路徑文件。嘗試下面的代碼來創建文件路徑

os.path.abspath('tmp/' + datetime.datetime.now().strftime('%Y%m%d%H%M') + '.png') 
+0

如果我指定的絕對路徑,用戶ABSPATH在瀏覽器中獲得,但仍無法下載QR碼。 – kotmsk