I cannot debug bottle. I have 500 errors in dev. I am using the latest bottle wit the debug=True flag.
if __name__ == "__main__":
# Interactive mode
run(host='localhost', port=8049,debug=True)
This is what I get.....
Bottle v0.11.rc1 server starting up (using WSGIRefServer())...
Listening on http://localhost:8049/
Hit Ctrl-C to quit.
localhost - - [30/Sep/2012 18:59:13] "POST /bidder/ HTTP/1.1" 500 1407
localhost - - [30/Sep/2012 18:59:14] "POST /bidder/ HTTP/1.1" 500 1407
localhost - - [30/Sep/2012 18:59:14] "POST /bidder/ HTTP/1.1" 500 1407
localhost - - [30/Sep/2012 18:59:15] "POST /bidder/ HTTP/1.1" 500 1407
localhost - - [30/Sep/2012 18:59:15] "POST /bidder/ HTTP/1.1" 500 1407
I don't mind the 500 as long I can find out why?
The debug=False keyword parameter in the run() function is only available in the current development version; the current 0.10.x code itself ignores doesn't yet support it.
Instead, use the debug() function instead:
if __name__ == "__main__":
# Interactive mode
run(host='localhost', port=8049)
debug(True)
or run with the --debug command-line flag.
You may have to import the debug function from bottle if you haven't done so already. The tutorial explains debug mode in more detail.
Related
I have recently created a flask app that streams a video to my local network. This is on a raspberry pi. I have attempted to make a log file using this code::
import logging
logging.basicConfig(filename='error.log',level=logging.DEBUG)
When I run the flask app with app.run(), the app will not log anything to the error.log file. But, when I run it with debug=true , then the app logs all info. The error.log file when I run it looks like this:
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:37:40] "GET /video_feed HTTP/1.1" $
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:37:40] "GET /static/css/bootstrap.$
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:39:45] "GET /video_feed HTTP/1.1" $
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:08] "GET / HTTP/1.1" 200 -
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:08] "GET /video_feed HTTP/1.1" $
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:09] "GET /logs HTTP/1.1" 200 -
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:10] "GET /invalidpass HTTP/1.1"$
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:21] "GET /logs HTTP/1.1" 200 -
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:29] "GET / HTTP/1.1" 200 -
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:30] "GET /video_feed HTTP/1.1" $
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:31] "GET /logout HTTP/1.1" 302 -
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:31] "GET /welcome HTTP/1.1" 302$
INFO:werkzeug:10.0.0.127 - - [10/Feb/2018 16:40:31] "GET /login HTTP/1.1" 200 -
I was wondering if it is possible to not have the Debug on when I run my flask app, and still log all information to the error.log file. I have tried switching the level to logging.INFO but that has not worked.
Try setting the logging level to error.
logging.basicConfig(filename='error.log',level=logging.ERROR)
You are setting the log level for the root logger but as mentioned in the flask logging docs flask configures its own logger in the 'flask' logging namespace.
The application logger is available as a property on the application object. Do
app = Flask(__name__)
app.logger.setLevel(logging.DEBUG)
if you'd like to always show logs at DEBUG level.
I couldn't figure out which way I wanted to go with logging that way, so I decided to create my own logging instance, and then log any info I wanted to it, which seemed to work. Although this is a longer and manual process, it let me control what was logged and how it was logged. The code looked similar to this::
#Import requests from flask to log things such as form data and other requests made to the server
from flask import request
#import python logging for logging to files
import logging
from logging.handlers import RotatingFileHandler
#How I logged the information I wanted to log
logInfo = 'Info on Login: ' + 'IP: ' + request.remote_addr
app.logger.info(logInfo)
#Create the logging instance test
handler = RotatingFileHandler('error.log', maxBytes=10000, backupCount=1)
handler.setLevel(logging.INFO)
app.logger.addHandler(handler)
app.logger.info('INFO TEST')
I am currently developing a python web-app based on bottle so what I am trying to do is print the outcome of a for loop I have tried the following
#!/usr/bin/python
from bottle import *
#route('/')
def index():
for i in range(10):
return i
but this did not work and i got this from the development server output
localhost - - [13/Jan/2017 18:11:38] "GET /request HTTP/1.1" 200 0
localhost - - [13/Jan/2017 18:11:40] "GET /favicon.ico HTTP/1.1" 200 0
so i tried this
#!/usr/bin/python
from bottle import *
#route('/')
def index():
sumOfValues=0
for i in range(10):
sumOfValues+=i
return sumOfValues
this also did not work
and my devlopment server gave me this
localhost - - [13/Jan/2017 18:15:44] "GET /request HTTP/1.1" 500 746
localhost - - [13/Jan/2017 18:15:46] "GET /favicon.ico HTTP/1.1" 500 750
so how can I do it I tried searching google but nothing came back
, thanks in advance
Function has to return string - so use return str(sumOfValues)
If you return in a function, it immediately ends.
It looks like you want to do a streaming response of-sorts. Bottle can do this, but you must yield items.
See also:
Streaming Connection Using Python Bottle, Multiprocessing, and gevent
I am new to Django and this question may seem to be easy. In the terminal where "python manage.py runserver" is executed, the following logs periodically appear.
[30/Sep/2015 02:36:02] "GET /messages/check/?_=1443574208652 HTTP/1.1" 200 1
[30/Sep/2015 02:36:08] "GET /notifications/check/?_=1443574208653 HTTP/1.1" 200 1
[30/Sep/2015 02:36:08] "GET /feeds/update/?first_feed=13&last_feed=6&feed_source=all&_=1443574208655 HTTP/1.1" 200 173
[30/Sep/2015 02:36:08] "GET /feeds/check/?last_feed=13&feed_source=all&_=1443574208654 HTTP/1.1" 200 1
[30/Sep/2015 02:36:39] "GET /notifications/check/?_=1443574208656 HTTP/1.1" 200 1
[30/Sep/2015 02:36:39] "GET /feeds/check/?last_feed=13&feed_source=all&_=1443574208658 HTTP/1.1" 200 1
[30/Sep/2015 02:36:39] "GET /feeds/update/?first_feed=13&last_feed=6&feed_source=all&_=1443574208657 HTTP/1.1" 200 173
[30/Sep/2015 02:37:03] "GET /messages/check/?_=1443574208659 HTTP/1.1" 200 1
My Django virtual environment is as follows:
bleach==1.4
dj-database-url==0.3.0
dj-static==0.0.6
Django==1.6.5
gunicorn==19.3.0
html5lib==0.9999999
Markdown==2.4.1
Pillow==2.4.0
psycopg2==2.6.1
python-decouple==2.2
six==1.9.0
South==0.8.4
static3==0.6.1
Unipath==1.0
Questions are:
Why does the logs periodically appear? I guess there is a background task running.But Celery package is not used here.
How to configure the logs, for example, displaying one more logs such as:
/followers/check/?_=9896886900907 HTTP/1.1
What do "?_" and the long string of numbers stand for? I can understand the "?first_feed=13" means the querying parameter in Django request object.
GET /notifications/check/?_=1443574208656
When Django is run in development mode (with runserver) it prints a line for all HTTP requests received to the console.
All of them are coming from the outside, browsers, feed readers...
The parameters you are wondering about are GET query parameters. The ? is the delimiter so, _ is the key of the argument.
In development mode the logging is defined by default. If you want to have logging on your production system or more logging, read https://docs.djangoproject.com/en/1.8/topics/logging/ .
Flask seems to be not adding a slash at the url end before the get parameters in every case. But is doing it only in this case.
it changes /users?uid=1 to /users/?uid=1
After changing it to tha it even gives me a 404 error. "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again."
Here's the code:
from flask import Flask, render_template, jsonify, Response, request
app = Flask(__name__)
#app.route("/users")
#app.route("/post")
#app.route("/bookmarks")
#app.route("/<target>")
def category_browser(target = ""):
if(target != "" and target not in ['categories']):
return render_template("404.html")
else:
return render_template("view.html")
if(__name__ == "__main__"):
app.debug = True;
app.run(port=int(80))
You had a stale cache entry in instance of Chromium when you had the route defined as #app.route("/users/"). You later changed to #app.route("/users") which Chrome still had it cached with the trailing /. Try accessing this simple example using incognito mode and see that /users?uid=1 remaining unchanged and that no 404 is reported. This is what happens when I first accessed it initially (using Chrome 42).
127.0.0.1 - - [07/Jul/2015 14:02:39] "GET /users?target=1 HTTP/1.1" 200 -
Then stopping that script (thanks for that complete almost self-contained example) and add #app.route("/users/") to the list of routes, below the original #app.route("/users/") route (to have a higher order of precedence so that Flask first trigger the redirect), i.e.:
#app.route("/users")
#app.route("/users/")
(Or simply remove the #app.route("/users") decorator)
Now try accessing the same page again in your incognito session, note that in your console:
127.0.0.1 - - [07/Jul/2015 14:04:11] "GET /users?target=1 HTTP/1.1" 301 -
127.0.0.1 - - [07/Jul/2015 14:04:11] "GET /users/?target=1 HTTP/1.1" 200 -
Ah, there's your redirect. Remove that extra line we just added, try going to /users?target=1 again, this is what happens:
127.0.0.1 - - [07/Jul/2015 14:07:22] "GET /users/?target=1 HTTP/1.1" 404 -
Chrome silently rewrites the URL to /users/?target=1 based on the cache entry in the incognito mode, and is reflected because only that URL is showing up on the Flask access log.
If you wish to support both methods, you have to do it this way:
#app.route("/users/")
#app.route("/users")
Then both access methods work:
127.0.0.1 - - [07/Jul/2015 14:08:49] "GET /users/?target=1 HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2015 14:08:59] "GET /users?target=1 HTTP/1.1" 200 -
Rather than resulting in:
127.0.0.1 - - [07/Jul/2015 14:10:00] "GET /users?target=1 HTTP/1.1" 301 -
127.0.0.1 - - [07/Jul/2015 14:10:00] "GET /users/?target=1 HTTP/1.1" 200 -
I'm getting some really strange behaviour when running gevent's WSGIServer. It seems like every request that comes through is having its method interpreted incorrectly..
If I send the following requests:
requests.get('http://localhost:5000')
requests.head('http://localhost:5000')
requests.delete('http://localhost:5000')
requests.put('http://localhost:5000')
requests.post('http://localhost:5000')
This is what appears in the console:
127.0.0.1 - - [2012-01-22 14:55:36] "POST / HTTP/1.1" 405 183 "-" "python-requests/0.9.1"
127.0.0.1 - - [2012-01-22 14:55:41] "DELETE / HTTP/1.1" 405 185 "-" "python-requests/0.9.1"
127.0.0.1 - - [2012-01-22 14:55:46] "16 / HTTP/1.1" 405 181 "-" "python-requests/0.9.1"
127.0.0.1 - - [2012-01-22 14:55:50] "8 / HTTP/1.1" 405 180 "-" "python-requests/0.9.1"
127.0.0.1 - - [2012-01-22 14:56:13] "HEAD / HTTP/1.1" 200 0 "-" "python-requests/0.9.1"
For completeness, this is the script I'm running:
from gevent.wsgi import WSGIServer
from flask import Flask
app = Flask(__name__)
app.debug = True
#app.route("/")
def hello():
return 'hello'
port = 5000
http_server = WSGIServer(('', port), app)
http_server.serve_forever()
What could be going on?
Edit:
I'm using gevent version: 0.13.0
Libevent has a limited support for HTTP methods and which HTTP methods are supported depends on a libevent version. Why you have a number instead of a method is obviously a bug. Could it be that you're building and linking gevent against different versions?
Can you try switching to gevent.pywsgi? That'll fix the issue at the cost of some performance.
Also the 1.0 version of gevent has a number of great improvements. You can get it there: http://code.google.com/p/gevent/downloads/list