0

When I specify an IP and port without the preceding:

if __name__ == '__main__':

As such:

app.run(host="138.165.91.210",port=5017,threaded=True)

It works but it hangs a bit (does it hang on an infinite loop maybe?). When I do the usual:

if __name__ == '__main__':
    app.run(host="138.165.91.210",port=5017,threaded=True) 

It avoids the ip and port. What's wrong with my code?

Full script:

import os
from sqlite3 import dbapi2 as sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, \
     render_template, flash


# create our little application :)
app = Flask(__name__)


# Load default config and override config from an environment variable



def connect_db():
    """Connects to the specific database."""
    rv = sqlite3.connect(app.config['DATABASE'])
    rv.row_factory = sqlite3.Row
    return rv


def init_db():
    """Initializes the database."""
    db = get_db()
    with app.open_resource('schema.sql', mode='r') as f:
        db.cursor().executescript(f.read())
    db.commit()


@app.cli.command('initdb')
def initdb_command():
    """Creates the database tables."""
    init_db()
    print('Initialized the database.')


def get_db():
    """Opens a new database connection if there is none yet for the
    current application context.
    """
    if not hasattr(g, 'sqlite_db'):
        g.sqlite_db = connect_db()
    return g.sqlite_db


@app.teardown_appcontext
def close_db(error):
    """Closes the database again at the end of the request."""
    if hasattr(g, 'sqlite_db'):
        g.sqlite_db.close()


@app.route('/')
def show_entries():
    db = get_db()
    cur = db.execute('select title, text from entries order by id desc')
    entries = cur.fetchall()
    return render_template('show_entries.html', entries=entries)


@app.route('/add', methods=['POST'])
def add_entry():
    if not session.get('logged_in'):
        abort(401)
    db = get_db()
    db.execute('insert into entries (title, text) values (?, ?)',
               [request.form['title'], request.form['text']])
    db.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('show_entries'))


@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif request.form['password'] != app.config['PASSWORD']:
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            flash('You were logged in')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)


@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('show_entries'))

@app.route("/hello")
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run(host="138.165.91.210",port=5017,threaded=True) 

Edit:

I'm running the app using bash:

flask --app=flaskr run
Tom
  • 9,275
  • 25
  • 89
  • 147

1 Answers1

1

You are using an unreleased version of Flask, so keep in mind that things might change.

__name__ == '__main__' only evaluates to True when you execute a file directly (i.e., python filename.py). Since that isn't how you're running it here, it will be False and that block is skipped.

To solve your port issue, when running your application using the flask command, you need to specify your options through the command line.

python -m flask --app flaskr --host 138.165.91.210 --port 5017 --with-threads

For more information, you should check the usage

python -m flask --help

To solve your delay issue, the if __name__ == '__main__': block is important. Without it, Flask will try to run two instances of the application (once from the flask command and one from the call to app.run).

dirn
  • 19,454
  • 5
  • 69
  • 74