1

I'm using flask as a python framework for my object detection REST API and it works just fine on MacOS. The application takes the uploaded image and it works on that. I'm sending a POST request to upload the image to the server. Just to give you an insight into my code: see image

@app.route('/post', methods=['GET', 'POST'])
def post():
  form = PhotoForm(CombinedMultiDict((request.files, request.form)))
  if request.method == 'POST' and form.validate():
    with tempfile.NamedTemporaryFile() as temp:
      form.input_photo.data.save(temp)
      temp.flush()
      print(temp.name)
      result = detect_objects(temp.name)

    photo_form = PhotoForm(request.form)
    return render_template('upload.html',
                           photo_form=photo_form, result=result)
  else:
    return redirect(url_for('upload'))

However, when I try to run the same application on Windows 10, I get the following server error 500: see image

127.0.0.1 - - [08/Feb/2018 15:32:24] "GET / HTTP/1.1" 200 -
C:\Users\KUGUOG~1.KAA\AppData\Local\Temp\tmpw6y5g2f9
[2018-02-08 15:32:37,369] ERROR in app: Exception on /post [POST]
Traceback (most recent call last):
  File "c:\python36\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "c:\python36\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "c:\python36\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "c:\python36\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "c:\python36\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "c:\python36\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\kuguoglu.berk.kaan\Desktop\ObjectDetectionRestApi\app.py", line 188, in post
    result = detect_objects(temp.name)
  File "C:\Users\kuguoglu.berk.kaan\Desktop\ObjectDetectionRestApi\app.py", line 149, in detect_objects
    image = Image.open(image_path).convert('RGB')
  File "c:\python36\lib\site-packages\PIL\Image.py", line 2543, in open
    fp = builtins.open(filename, "rb")
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\KUGUOG~1.KAA\\AppData\\Local\\Temp\\tmpw6y5g2f9'
127.0.0.1 - - [08/Feb/2018 15:32:37] "POST /post HTTP/1.1" 500 -

I skimmed through quite a few posts and forums and I thought this might be related to file permission in Windows OS. As it explicitly says permission error and all the related posts I've read so far mentions file permissions I do not think that it's related to the program itself. If it was the case, it wouldn't work smoothly on MacOS in the first place.

So far, I have tried listening to different ports, including 80 and 8080, and running the program as an administrator through PyCharm terminal and command prompt. However, these did not solve the issue.

I'm using Python 3.6.3, Flask 0.12.2, in case it helps you figure out the issue. Feel free to ask me for more details, if needed. I'd be happy to provide if I can.

Cheers.

Edit: I tried some of the suggested ways in the following two posts, however, all of them failed.

How to run python script with elevated privileges on Windows

Request UAC elevation from within python scripts - 1

Request UAC elevation from within python scripts - 2

PermissionError: [Errno 13] Permission denied

Further, I disabled read-only option for the directory below to see if it solves the problem but it didn't.

C:\Users\KUGUOG~1.KAA\AppData\

bkaankuguoglu
  • 1,192
  • 1
  • 13
  • 33

1 Answers1

0

Are you running with pycharm?

If you are running with cmd, run the command first as administrator.

When you find the cmd.exe, right click it and click on run as administrator

Elif you are using pycharm, run it as administrator as well.

Drugo
  • 169
  • 3
  • 14
  • I tried them all, but they didn't help. Thanks for your contribution! – bkaankuguoglu Feb 08 '18 at 14:46
  • I found your code at github. If you use ByteIO instead of tempfile? – Drugo Feb 08 '18 at 14:56
  • Can you elaborate how it would be different than the current approach? – bkaankuguoglu Feb 08 '18 at 15:11
  • Instead of creating an temp file with the image, and passing it to the path argument of the detect_object function, create a bytesio stream with the image in the memory and pass it to the function. It will require changing the detect_object function, though. – Drugo Feb 08 '18 at 15:37