请求将可正常打印的Flask收据打印机代码转换为Django实现
问题:将CloudPRNT收据打印机驱动的Flask代码转换为Django实现
我需要实现通过POST/GET命令驱动收据打印机的功能。自行编写的Django代码运行无报错但无法打印,对应的Flask代码可正常工作,请求将这套Flask代码转换为正确的Django实现。
我的Django尝试代码
import requests import json from email import header import mimetypes import urllib.request from urllib import response from django.http import HttpResponse from django.http import JsonResponse content = "some content" if request.method == "POST": data = {"jobReady": "true", "mediaTypes":["text/plain"]} return JsonResponse(data) if request.method == "GET": data = open("print.txt","r") response_r = { 'response':data, 'status':200, 'mimetype':'text/plain' } return HttpResponse(response_r) if request.method == "DELETE": status_code = request.GET['code'] if (status_code == "200 OK"): print("Success") return HttpResponse(status=200) if (status_code == "211 OK Paper Low"): print("Success, Paper Low") return HttpResponse(status=200)
可用的Flask代码
from email import header import mimetypes from urllib import response import urllib.request from flask import Flask, request, jsonify, Response, make_response app = Flask(__name__) #flask --app CloudPRNTDemo run -h 192.168.1.218 -p 8000 @app.route('/') def home(): yes = ("home page") return(yes) @app.route('/print/', methods=['POST', 'GET', 'DELETE']) def cloudPRNTPOST(): if request.method == "POST": data = {"jobReady": "true", "mediaTypes":["text/plain"]} print(data) return jsonify(data) if request.method == "GET": data = open("print.txt","r") response_r = app.response_class( response=data, status=200, mimetype='text/plain' ) # response.headers['X-Star-Buzzerendpattern'] = 1 return response_r if request.method == "DELETE": status_code = request.args.get('code') print(status_code) if (status_code == "200 OK"): print("Success") return app.response_class(status=200) if (status_code == "211 OK Paper Low"): print("Success, Paper Low") return app.response_class(status=200) return if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug = True)
正确的Django实现代码
Django视图必须封装为接收request参数的函数,同时需要配置对应路由,以下是完整转换代码:
views.py文件内容
from django.http import HttpResponse, JsonResponse def home(request): return HttpResponse("home page") def cloud_prnt(request): if request.method == "POST": data = {"jobReady": "true", "mediaTypes": ["text/plain"]} print(data) return JsonResponse(data) elif request.method == "GET": # 安全读取打印文件内容,自动关闭文件 with open("print.txt", "r") as f: data = f.read() # 构造文本响应 response = HttpResponse(data, status=200, content_type='text/plain') # 如需添加自定义响应头(比如蜂鸣设置),取消下方注释 # response['X-Star-Buzzerendpattern'] = '1' return response elif request.method == "DELETE": status_code = request.GET.get('code') print(status_code) if status_code == "200 OK": print("Success") return HttpResponse(status=200) elif status_code == "211 OK Paper Low": print("Success, Paper Low") return HttpResponse(status=200) # 处理未定义的请求方法 return HttpResponse(status=405)
urls.py配置(在你的Django应用中)
from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('print/', views.cloud_prnt, name='cloud_prnt'), ]
原Django代码的问题说明
- 视图结构错误:原代码未将逻辑封装为接收
request参数的函数,Django视图必须以函数/类视图形式存在,且第一个参数为request对象。 - GET请求响应错误:原代码将文件对象包装为字典传给
HttpResponse,正确做法是读取文件内容后传入,或直接传入文件对象(推荐用with语句确保文件关闭)。 - 参数获取不安全:原代码用
request.GET['code']会在参数不存在时触发KeyError,改用request.GET.get('code')可避免报错。 - 缺少默认返回:原代码未处理未定义的请求方法,应返回405状态码表示方法不允许。
内容的提问来源于stack exchange,提问作者stelity
相关产品推荐
相关产品推荐

