pythonflaskraspberry-pi

Flask Does Not Find Application In Raspberry Pi


Firstly I would like to say that I have the source code working with flask on MacOS and Windows 10 (various people are developing the site). We want to run our source code in the Raspberry Pi 3 B+. I have installed flask and python on RPI. Here are the details:

flask --version
Flask 0.12.1

Python 3.5.3 (default, Sep 27 2018, 17:25:39) 

The only difference between my MacOS is that Python is 3.7.5 and Flask is 1.0.2. (I tried to update python and flask on RPI multiple times and it would always install the same)

This is where the versions case negate, I made an arbitrary python file in RPI:

from flask import Flask, render_template, request
app = Flask(__name__)

@app.route('/')
def test():
    return "HELLO"

if __name__ == '__main__':
    app.run(debug = True, port=8080)
python3 test.py

This runs the flask server on RPI's localhost no problem.

The problem is when I try to run the source code on RPI via:

export FLASK_APP=SmartLock
export FLASK_ENV=development
flask run

I get the following message:

pi@raspberrypi:~/Downloads/CSI4999 $ export FLASK_APP=SmartLock
pi@raspberrypi:~/Downloads/CSI4999 $ flask run
Usage: flask run [OPTIONS]

Error: Failed to find application in module "SmartLock".  Are you sure it contains a Flask application?  Maybe you wrapped it in a WSGI middleware or you are using a factory function.

My structure

CSI4999
       |
       SmartLock
                |
                -static
                -templates
                __init__.py
                other modules

I run the commands from inside CSI4999 (like I do on PC). Unless Raspberry Pi would require a different structure, I don't see why it runs on MacOS and Windows 10 and not on RPI.

I searched over the Flask Documentation (I also tried [https://flask.palletsprojects.com/en/1.1.x/tutorial/factory/]) and internet nothing helped.

I even tried to do:

python -m flask run

but that would return

  File "/usr/lib/python3.5/socketserver.py", line 454, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use

Any input would greatly appreciated.

[Update:]

I have installed Python 3.7 and Flask 1.1 flask PATH is :

PATH:/usr/lib/python3/dist-packages/flask

pi@raspberrypi:~ $ flask --version
Python 3.7.5
Flask 1.1.1
Werkzeug 0.16.1

Inside pi@raspberrypi:~/Downloads/CSI4999/

FLASK_APP=SmartLock
flask run

returns:

 * Serving Flask app "SmartLock"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
/usr/local/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
Traceback (most recent call last):
  File "/usr/local/bin/flask", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/flask/cli.py", line 966, in main
    cli.main(prog_name="python -m flask" if as_module else None)
  File "/usr/local/lib/python3.7/site-packages/flask/cli.py", line 586, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/flask/cli.py", line 860, in run_command
    extra_files=extra_files,
  File "/usr/local/lib/python3.7/site-packages/werkzeug/serving.py", line 1012, in run_simple
    inner()
  File "/usr/local/lib/python3.7/site-packages/werkzeug/serving.py", line 965, in inner
    fd=fd,
  File "/usr/local/lib/python3.7/site-packages/werkzeug/serving.py", line 808, in make_server
    host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd
  File "/usr/local/lib/python3.7/site-packages/werkzeug/serving.py", line 701, in __init__
    HTTPServer.__init__(self, server_address, handler)
  File "/usr/local/lib/python3.7/socketserver.py", line 452, in __init__
    self.server_bind()
  File "/usr/local/lib/python3.7/http/server.py", line 137, in server_bind
    socketserver.TCPServer.server_bind(self)
  File "/usr/local/lib/python3.7/socketserver.py", line 466, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use

Which means flask runs and module is found. Now this is another issue. Any Ideas?

[Update]

REFLASHING RASPIAN ON SDCARD SOLVED ISSUE. USE ONLY PIP3 TO INSTALL LIBRARIES


Solution

  • It looks like you may have accidentally intermingled a Python2.7 and a Python3 install of Flask, which is sadly easy to do. In your situation, I've be very tempted to reimage the SD card with a fresh copy of Raspbian, then be scrupulously careful to do

    pip3 install flask
    

    instead of

    pip install flask
    

    and then be careful to always use python3 intead of python.