Python Flask“send_file()”方法TypeError

时间:2017-12-05 05:26:41

标签: python flask

我正在尝试阅读用户上传的图片,然后将图片显示回来。我想这样做而不保存上传的图像文件。

我有这样的代码:

import pygame
import time
import random
import Mycharacter
import enemy
import obstacle
import json

GREEN = (0, 255, 0)

class Controller:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((800, 800))
        self.background = pygame.Surface(self.screen.get_size()).convert()
    #self.button_image = pygame.image.load("start_button.png").convert
    self.button = pygame.Rect(350, 50, 100, 100)
    #self.button_image.get_rect()
    self.font = pygame.font.Font("Shark_Soft_Bites.TTF", 60)
    self.text = pygame.font.Font.render(self.font,"Start", True, (255, 0, 0))
    #self.score_text = pygame.font.Font.render("Highscore: "+ str())
    self.file = open("highscores.json", "r")
    self.currentState = "Start"
    self.obstacles = []
    for i in range(5):
        x = random.randrange(50, 600)
        y = random.randrange(60, 700)
        self.obstacles.append(obstacle.Obstacle((x, y), 'rock.png' ))
    self.enemies = []
    for i in range(3) :
        if i == 0:
            x = 725
            y = 100
        elif i == 1:
            x = 75
            y = 700
        elif i == 2:
            x = 725
            y = 700
        self.enemies.append(enemy.Enemy((x, y), "enemy.png"))
    self.Mycharacter = Mycharacter.Mycharacter((75, 100), "head6.png")
    self.mysprites = pygame.sprite.Group((self.Mycharacter,) + tuple(self.enemies) + tuple(self.obstacles))
    self.mysprites2 = pygame.sprite.Group(tuple(self.enemies) + tuple(self.obstacles))
    self.score = 0
    self.end_time = 0
    self.start_time = 0
    self.time = (self.end_time-self.start_time) * 1000

def mainLoop(self):
    """
    This is the main loop for the game that calls the other functions in this class
    in order to create a start screen, run the game, and present the high score and player
    score at the end of the game.
    Param list: None
    Return list: None
    """
    self.done = False
    while not self.done:
        if self.currentState == "start":
            self.startGame(self)
        elif self.currentState == "running":
            self.start_time = pygame.time.get_ticks()
            self.runGame(self)
        elif self.currentState == "end":
            self.endGame(self)
    pygame.quit

def startGame(self):
    """
    This is the function for the start of the game.  It fills the screen
    with a different color background and creates the start button that the user
    can click on to begin running the game.
    Param list: None
    Returns: None
    """
    start = True
    while start:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.done = True
                start = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                if self.button.collidepoint(mouse_pos):
                    self.currentState = "running"
                    start = False
        self.screen.fill((255, 0, 255))
        pygame.draw.rect(self.screen, (0, 0, 0), self.button)
        self.screen.blit(self.text, (350,50))
        pygame.display.flip()
    pygame.quit

def runGame(self):
    run = True
    clock = pygame.time.Clock
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.done = True
                run = False
            if event.type == pygame.KEYDOWN:
            #Under here is the game logic and i don't know if i should have the random enemy movement under here
                if(event.key == pygame.K_UP):
                    self.Mycharacter.move_up()
                elif(event.key == pygame.K_DOWN):
                    self.Mycharacter.move_down()
                elif(event.key == pygame.K_LEFT):
                    self.Mycharacter.move_left()
                elif(event.key == pygame.K_RIGHT):
                    self.Mycharacter.move_right()
            self.score += 1
            if self.score > 400:
                if self.score > 800:
                    if self.score > 1200:
                        self.enemy.speed(18)
                    else:
                        self.enemy.speed(16)
                else:
                    self.enemy.speed(14)
            else:
                self.enemy.speed(12)

            self.mysprites.update()
            #self.mysprites2.group_collide
            #possibly sprite.groupcollide to save myself these two loops but I like the loops
            #also idk if the dokill means it will .kill() or something else
            for i in range(len(self.obstacles)):
                if(pygame.sprite.collide_rect(self.Mycharacter, self.obstacle[i])):
                    self.Mycharacter.kill()
                    self.currentState = "end"
                    self.end_time = pygame.time.get_ticks()
                    run = False

            for i in range(len(self.enemies)):
                if(pygame.sprite.collide_rect(self.Mycharacter, self.enemies[i])):
                    self.Mycharacter.kill()
                    self.currentState = "end"
                    self.end_time = pygame.time.get_ticks()
                    run = False

            self.screen.fill(GREEN)
            #self.obstacles.draw(self.screen)
            #self.enemies.draw(self.screen)
            self.screen.blit(self.background, (0, 0))
            self.mysprites.draw()
            #self.screen.blit(self.Mycharacter,(self.Mycharacter.rect.x, self.Mycharacter.rect.y))
                    #drawing code
                    #update screen with what has been drawn
            pygame.display.flip()

            clock.tick(60)
    pygame.quit

def endGame(self):
    #self.screen = pygame.display.set_mode(800, 800)
    #self.background = pygame.Surface(self.screen.get_size()).convert()
    end = False
    while not end:
        for event in pygame.event.get():
            if event == pygame.QUIT:
                end = True
                self.done = True
            else:
                line = json.load(self.file.readline())
                num = line["one"]
                self.file.close()
                if self.time > int(num):
                    self.file = open("highscores.json", "w")
                    newstr = "highscore:"+str(num)
                    jsonstr = json.dump(newstr)
                    self.file.write(newstr)
                    self.file.close
                self.file = open("highscores.json", "r")
                newline = json.load(self.file.readline())
                score = newline["highscore"]
                self.file.close()
                self.screen.fill((0, 0, 255))
                #create text and rect to blit onto screen to display high score
                self.screen.blit("Highscore: " + str(score), (350, 50))
                self.screen.blit("Your Score: " + str(num), (350, 150))
                pygame.display.flip()
    pygame.quit


def main():
    the_game = Controller()
    the_game.mainLoop()

main()

它产生了这个错误:

from flask import Flask, redirect, render_template, request, url_for, send_file from PIL import Image, ImageDraw from io import BytesIO app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': img = Image.open(request.files['file'].stream) byte_io = BytesIO() img.save(byte_io, 'PNG') byte_io.seek(0) return send_file(byte_io, mimetype='image/png')

我已尝试将TypeError: send_file() got an unexpected keyword argument 'mimetype'替换为其他有效参数,它只会给出相同的错误,但会显示新参数的名称。所以我认为问题在于mimetype

更新:

要澄清一下,bytes_io我指的是内置的send_file()方法:

1 个答案:

答案 0 :(得分:3)

来自flask document

  

mimetype猜测需要提供文件名或attachment_filename。

     

...

     
      
  • mimetype - 文件的mimetype(如果提供)。如果给出了文件路径,则自动检测作为回退发生,否则将引发错误。
  •   

所以,你应该像这样提供

return send_file(io.BytesIO(obj.logo.read()),
                 attachment_filename='logo.png',
                 mimetype='image/png')

我已经更新了我的回答,
首先,下面的示例代码应该正常运行,

from flask import Flask
app = Flask(__name__)

@app.route('/get_image')
def get_image():
    if request.args.get('type') == '1':
       filename = 'ok.gif'
    else:
       filename = 'error.gif'
    return send_file(filename)


if __name__ == '__main__':
    app.run()

其次,如果您仍然遇到同样的错误,我认为您的环境'问题。您可以使用pip freeze检查您的python包版本。