I have a flask app trying to deploy on Azure App Service, but having a difficult time to debug the server error. I'd like to print out some information so as to see where the errors lies, just like how I would debug locally. I already tried the stream log, but it is printing out some html in the application log:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>IIS Detailed Error - 500.0 - INTERNAL SERVER ERROR</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana,Arial,Helvetica,sans-serif;}
code{margin:0;color:#006600;font-size:1.1em;font-weight:bold;}
Which is not really what I am looking for. Also tried to set up the wsgi log in the application settings but it also doesn't show anything specific about what the error is.
So how should I set up the console output for the server? Where should I look for it?
Related
I am following this Network Chuck YT video to learn basic Python Flask. I got the app working, but I am running it inside an Ubuntu "multipass" VM, so it cannot use the loopback address, 127.0.0.1. When the app launches from the IPv4 address on port 8080 (currently 192.168.64.5) and it works fine on initial launch, but the IP of the Ubuntu VM can (and will) change, so I don't want to hardcode it, if possible.
Here is my Python Flask code:
#!/bin/python
from flask import Flask, render_template
import requests
import json
app = Flask(__name__)
def get_meme():
sr = "/wholesomememes"
url = "https://meme-api.herokuapp.com/gimme" + sr
url = "https://meme-api.herokuapp.com/gimme"
response = json.loads(requests.request("GET", url).text)
meme_large = response["preview"][-2]
subreddit = response["subreddit"]
return meme_large, subreddit
#app.route("/")
def index():
meme_pic,subreddit = get_meme()
return render_template("meme_index.html", meme_pic=meme_pic, subreddit=subreddit)
app.run(host="192.168.64.5", port=8080)
Here is my HTML for the webpage:
<html>
<head>
<title>Meme Website</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="refresh" content="30;url=http://192.168.64.5:8080/" />
<style>
body {background-color:#000000;background-repeat:no-repeat;background-position:top-left}
h1 {text-align:center; font-family:Arial, sans-serif; color:#FFFFFF; background-color:#000000}
p {text-align:center;font-family:Georgia, serif; color:#FFFFFF; font-size:48px;font-style:normal}
</style>
</head>
<body>
<h1>A website to gather some memes!</h1>
<p>Here is your meme! This will refresh in 30 seconds!</p>
<p><img src="{{meme_pic}}"></p>
<p>Current subredddit: {{subreddit}} </p>
</body>
</html>
Is it possible to not hardcode the IPv4 address in either the Python Flask app or the HTML file?
UPDATE - final, fixed code here:
https://gitlab.com/kidacrimson/flask-memes
Usually servers can use host="0.0.0.0" to accept clients from all Network Cards installed in computer - lan, wifi and loopback (127.0.0.1).
And pages can use urls like url=/ without http://192.168.64.5:8080
After exposure to Svelte/Rollup in the JavaScript world I was impressed that it could refresh the browser automatically when changes were made to the source code. Seeking a similar behaviour in Python I found the package livereload that supports integration with Flask (pretty sure using the same tech). I want the result of the refresh to reflect ALL changes to the source code.
I am using WSL with livereload v2.5.1 and viewing via Chrome. I can successfully get the page to refresh on a detected source code change but the refresh doesn't re-download the new files and just displays the cached files. The page does refresh but I need to hit Ctrl + click refresh to see the actual changes. Using developer mode and turning off caching works as desired. Using Svelte/Rollup doesn't require disabling caching to see source changes.
Most of my changes are to *.css or *.js files served from the 'static' folder in a standard Flask project template and rendered using the 'render_template' function of Flask.
I'm launching my Flask server as follows:
app = create_app()
app.debug = True
app.config['TEMPLATES_AUTO_RELOAD'] = True
server = Server(app.wsgi_app)
server.watch(filepath='static/*', ignore=lambda *_: False)
server.serve(liveport=35729, host='127.0.0.1', port=80)
I would like to not have to disable the cache so that the refresh triggered by livereload actually reflects the changes in the source. Is there a setting in Flask or livereload I can use to achieve this or is this a feature request for the livereload package?
Related Question:
How to automate browser refresh when developing an Flask app with Python?
UPDATE EDIT:
Further testing has shown that this is specifically an issue with Chrome, with Firefox it works as expected out of the box. Digging into the underlying livereload.js library it seems there is a parameter of 'isChromeExtension' which I have tried to force set to True but had no effect.
I came across the same issue and here is what I did to solve the issue.
As you mentioned this is a browser caching problem. So we want invalidate the cached css/js files. We can achieve this by setting a version on the static file. We want the version to change each time you make changes to the css file. What I did feels a bit hacky but you'll get the idea.
Here is what I have for my html template
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<link href="{{ url_for('static', filename='main.css', version=time)}}" rel="stylesheet" type="text/css" />
</head>
<body>
<h1 class="hello-color">
{{ message }}
</h1>
</body>
</html>
You can see version=time I am passing the template the current time with the following.
from flask import Flask, render_template
from time import time
app = Flask(__name__)
#app.route("/")
def hello():
return render_template('hello.html', message="Hello World!", time=time())
from time import time and
time=time()
And finally my main python file
from app import app
from livereload import Server
if __name__ == '__main__':
server = Server(app.wsgi_app)
server.serve(port=2200, host='0.0.0.0')
Hopefully this helps you or anyone else running to this issue.
My deployments were all working fine during development then all of a sudden, without me changing anything Google stopped serving new files and stuck to a version.
I tried deleting all versions except the last one:
I tried clearing memcache
It tried versions->diagnose->source to look at the code directly on StackDriver, which could not be simpler:
I tried clearing browser cache and opening the url on a different computer
And still loading up the url serves the old content, like if it was cached somewhere.
if I use https://[VERSION].[APPID].appspot.com then it serves the last version. But only using https://[APPID].appspot.com serves the old version from yesterday that is not anywhere anymore.
What happened Google??
The only surefire technique I have found to bust all caching for Google App Engine is to change the base URL for each new version of the app.
app.yaml example
In this example, the base href rotates from b0, b1, ... b9 and then back to b0. However, this is arbitrary, as long as you aren't repeating base hrefs more than once every couple of weeks.
runtime: python37
service: default
handlers:
- url: /b3/(.*\.(html|htm|map|js))$
static_files: b3/\1
upload: b3/.*\.(html|htm|map|js)$
secure: always
- url: /b3/assets/
static_dir: b3/assets
secure: always
index.html example using Flask template
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<base href="/{{base_href}}/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<p>Hello world!</p>
</body>
</html>
One way to streamline the development process is to create a Python script to update the base hrefs in all impacted files.
There's a similar question on here, but the answers are over 2 years old and I can't get it to work. If I'm missing something - please let me know.
Bottle.py caching templates despite being in debug mode
Whenever the browser points to 0.0.0.0:8080/16boxes, I need to prevent caching. The Bottle docs say when in Debug mode, caching is disabled, but that isn't the case for me unfortunately.
Here is my hello.py code in question:
#route('/16boxes')
def send_static():
response.set_header('Cache-control', 'no-cache, must-revalidate')
return template (resource_path('16boxes.html'), globalVar0 = globalVar0)
run(host='0.0.0.0', port=8080, debug=True)
I open up terminal and run: python hello.py
It doesn't cache when I run it on my Mac/Chrome - but when I use Windows and Internet Explorer - it uses a cached version. How can I prevent this?
In my 16boxes.html, I even have the following in my :
<meta http-equiv="Cache-control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Pragma" content="no-cache">
Your problem is that your JavaScript onload event doesn't fire when the page loads as a result of browser caching, jQuery's ready event was created for just this sort of issue.
I am trying to use Flask to serve an SSE request, but my client only receives the events after my generator function has stopped / the connection is closed.
Here is the simplest reproduction I have been able to produce to demonstrate this:
#!/usr/bin/env python
from flask import Flask, Response
from time import sleep
def stream():
n = 10
while n > 0:
yield "data: hi\n\n"
sleep(0.5)
n = n - 1
app = Flask(__name__)
#app.route("/events")
def streamSessionEvents():
return Response(
stream(),
mimetype="text/event-stream"
)
app.run(debug=True, threaded=True)
Here is my test client:
<!doctype html>
<html>
<head>
<script>
var source = new EventSource(
"/events"
);
source.onmessage = function(event)
{
console.log(event);
};
</script>
</head>
<body>
</body>
</html>
The stream() generator will produce ten events and then return (I've deliberately done this to demonstrate the problem, ideally the generator would keep going forever), at which point the connection is dropped. The client page logs nothing until this point, then it spits out all ten events (if I dont have the counter variable in stream() then the page never gets any events).
I havent used Python or Flask a great deal and this has me very stuck, I cant see what I'm doing differently to other examples around the net. Any help very much appreciated.
Two things might interfere:
You have debug set to True, which installs middleware (specifically the Werkzeug debugger) that may break streaming.
From the Flask streaming patterns documentation:
Note though that some WSGI middlewares might break streaming, so be careful there in debug environments with profilers and other things you might have enabled.
However, using either curl or Chrome on your test code with Flask 0.10.1 and Werkzeug 0.9.4 I see the data: hi responses come streaming through properly, regardless of the debug flag setting. In other words, your code is working correctly with the most recent versions of the Flask stack.
EventSource streams are subject to same-origin policy limits. If you are not loading the HTML page from the same host and port, the request to your Flask server will be denied.
Adding the test page source in the Flask server at a separate route works for me:
#app.route('/')
def index():
return '''\
<!doctype html>
<html>
<head>
<script>
var source = new EventSource(
"/events"
);
source.onmessage = function(event)
{
console.log(event);
};
</script>
</head>
<body>
</body>
</html>
'''