multiple routes and function in bottle framework - python

I'm trying to modify already existing code, simply add form to add photos.
python:
#route('/photos/add')
#jinja_view('add.html')
#post('/photos/add')
def upload_func():
upload = request.files.get('pic')
name, ext = os.path.splitext(upload.filename)
if ext not in ('.png', '.jpg', '.jpeg'):
return "ext is not allowed"
save_path = "/src/photo_gallery/photos"
upload.save(save_path)
return "photo is saved"
HTML:
<form action="/photos/add" method="post">
<div align="center">
<label>Picture</label>
<input type="file" name="pic" required>
</div>
<div>
<label>Info</label>
<input type="text" name="text">
</div>
<div>
<input type="submit" value="add">
</div>
</form>
server log:
Traceback (most recent call last):
File "/home/empty/python/bottle/lib/python3.5/site-packages/bottle.py", line 862, in _handle
return route.call(**args)
File "/home/empty/python/bottle/lib/python3.5/site-packages/bottle.py", line 1740, in wrapper
rv = callback(*a, **ka)
File "/home/empty/python/bottle/lib/python3.5/site-packages/bottle.py", line 3635, in wrapper
result = func(*args, **kwargs)
File "/home/empty/python/bottle/src/photo_gallery/app.py", line 50, in upload_func
name, ext = os.path.splitext(upload.filename)
AttributeError: 'NoneType' object has no attribute 'filename'
127.0.0.1 - - [22/Dec/2016 23:20:42] "GET /photos/add HTTP/1.1" 500 751

You have linked the url path /photos/add to the callback function upload_func. It looks like you want to support two request types (GET and POST), then function decorators should look like this:
#route('/photos/add', method=['GET', 'POST'])
#jinja_view('add.html')
def upload_func():
# ...
Take a look at:
https://bottlepy.org/docs/dev/tutorial.html#request-routing
https://bottlepy.org/docs/dev/api.html#bottle.Bottle.route
Please also note that the code should not be written like this - too complex

Related

Error while creating query_string in flask

I have written an flask app.
This app allow users to upload images, if i run this app locally this app uploads images and saves it to the path which i have designated
Now i want to create a query string for my app where i will create urls and send it to people to upload images.
but when i run my app i receive this error
werkzeug.routing.BuildError: Could not build url for endpoint 'index'. Did you forget to specify values ['property_id']?
Traceback (most recent call last)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\prince.bhatia\Desktop\python-projects\new\app.py", line 77, in index
return render_template('index.html', property_id= property_id)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\templating.py", line 135, in render_template
context, ctx.app)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\templating.py", line 117, in _render
rv = template.render(context)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\jinja2\asyncsupport.py", line 76, in render
return original_render(self, *args, **kwargs)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\jinja2\environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\jinja2\environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\jinja2\_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "C:\Users\prince.bhatia\Desktop\python-projects\new\templates\index.html", line 14, in top-level template code
{{ dropzone.create(action_view='index') }}
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask_dropzone\__init__.py", line 330, in create
action_url = url_for(action_view, **kwargs)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\helpers.py", line 356, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2061, in handle_url_build_error
reraise(exc_type, exc_value, tb)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\helpers.py", line 345, in url_for
force_external=external)
File "C:\Users\prince.bhatia\AppData\Local\Programs\Python\Python36\lib\site-packages\werkzeug\routing.py", line 1776, in build
raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'index'. Did you forget to specify values ['property_id']?
The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error.
To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.
You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:
dump() shows all variables in the frame
dump(obj) dumps all that's known about the object
Below is my code:
from flask import Flask, redirect, render_template, request, session, url_for, send_file
from flask_dropzone import Dropzone
from flask_uploads import UploadSet, configure_uploads, IMAGES, patch_request_class
from flask_sqlalchemy import SQLAlchemy
import os
import psycopg2
import csv
app = Flask(__name__)
db = SQLAlchemy(app)
dropzone = Dropzone(app)
#app.config["SQLALCHEMY_DATABASE_URI"]="postgres://qpnwgdxnihlitm:22e4f6cbdb773f69aa468b2b7ddcd692552cb4102367ffc14c62f19403636477#ec2-54-243-223-245.compute-1.amazonaws.com:5432/d1ssufnnr78nll?sslmode=require"
app.config["SQLALCHEMY_DATABASE_URI"]= "postgresql://postgres:prince#25#localhost/images"
#app.config["SQLALCHEMY_DATABASE_URI"]='postgres://mapvmydehdyncf:7500963c956e3d5556df4a5f4fdd1a9a40f023c922bfe93194fb13b9322c86ad#ec2-23-21-165-188.compute-1.amazonaws.com:5432/d6lmau9918afdq?sslmode=require'
app.config['SECRET_KEY'] = 'supersecretkeygoeshere'
# Dropzone settings
app.config['DROPZONE_UPLOAD_MULTIPLE'] = True
app.config['DROPZONE_ALLOWED_FILE_CUSTOM'] = True
app.config['DROPZONE_ALLOWED_FILE_TYPE'] = 'image/*'
app.config['DROPZONE_REDIRECT_VIEW'] = 'results'
# Uploads settings
app.config['UPLOADED_PHOTOS_DEST'] = '/uploads'
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app) # set maximum file size, default is 16MB
class Data(db.Model):
__tablename__ = "image"
id=db.Column(db.Integer, primary_key=True)
link = db.Column(db.String(1000000), unique=True)
def __init__(self, link):
self.link = link
#app.route("/<string:property_id>", methods=['GET', 'POST'])
def index(property_id):
# set session for image results
if "file_urls" not in session:
session['file_urls'] = []
# list to hold our uploaded image urls
file_urls = session['file_urls']
# handle image upload from Dropszone
if request.method == 'POST':
file_obj = request.files
for f in file_obj:
file = request.files.get(f)
# save the file with to our photos folder
filename = photos.save(
file,
name=file.filename
)
# append image urls
file_urls.append(photos.url(filename))
d = file_urls.append(photos.url(filename))
for i in file_urls:
data = Data(i)
db.session.add(data)
db.session.commit()
session['file_urls'] = file_urls
return "uploading..."
# return dropzone template on GET request
return render_template('index.html', property_id= property_id)
#app.route('/results')
def results():
# redirect to home if no images to display
if "file_urls" not in session or session['file_urls'] == []:
return redirect(url_for('index'))
# set the file_urls and remove the session variable
file_urls = session['file_urls']
session.pop('file_urls', None)
dms = set(file_urls)
get_length = len(dms)
return render_template('results.html', dms=dms, get_length=get_length)
#app.route('/dashboard')
def dashboard():
conn = psycopg2.connect("dbname='images' user='postgres' password='prince#25' host='localhost' port='5432' ")
print(conn)
cur = conn.cursor()
data = cur.execute("SELECT DISTINCT link FROM image")
m_dict = cur.fetchall()
filename = "Productivity.csv"
with open("./"+filename,'w', encoding="utf-8") as csvfile:
csvfile = csv.writer(csvfile, m_dict)
csvfile.writerow(["Link"])
for i in range(0, len( m_dict )):
csvfile.writerow( m_dict[i] )
news = cur.execute("DELETE FROM image")
conn.commit()
return send_file(filename, attachment_filename="Data.csv", as_attachment=True)
if __name__=="__main__":
app.run(debug=True)
#app.run(debug=True)
this my index.html
<!DOCTYPE html>
<html>
<head>
<title>99Acres</title>
{{ dropzone.load() }}
{{ dropzone.style('border: 2px dashed #0087F7; margin: 10%; min-height: 400px;') }}
</head>
<body style="background-color:teal">
<!--<h1 style="color:white;">99Acres</h1>-->
<img align="right"src="https://img-d02.moneycontrol.co.in/news_image_files/2015/356x200/9/99acres_1902_356.jpg" width="80" height="80" alt="me">
<h1 align="center" style="color:white">Welcome to 99acres image upload website</h1>
<h3 align="center"style="color:white">Please Upload images in format[".JPG",".PNG",".JPEG"]</h3>
<h3 align="center" style="color:white">**Please Note:Maximum Total image size is 5MB</h3>
{{ dropzone.create(action_view='index') }}
<div class="list" align="center">
<strong>Our Partners:</strong> Naukri.com-
Jeevansathi Matrimonials- ICICIcommunities.org <br>
<br>
Home || About Us ||
Advertise with us || Terms and Conditions ||
Contact us || Reques1t info<br>
<br>
All rights reserved 2001 Info Edge India Ltd.
</div>
</body>
</html>
this is my results.html
<body style="background-color:teal">
<h1 align="center" style="color:white">Below Images Uploaded Successfully</h1>
Back<p>
<ul>
{% for file_url in dms %}
<img style="height: 150px" src="{{ file_url }}">
{% endfor %}
</ul>
<h1 align="center" style="color:white">You can close this page or upload more image</h1>
<h1 align="center" style="color:white">Total number of images are : {{get_length}}</h1> <br><br><br><br>
<div class="list" align="center">
<strong>Our Partners:</strong> Naukri.com-
Jeevansathi Matrimonials- ICICIcommunities.org <br>
<br>
Home || About Us ||
Advertise with us || Terms and Conditions ||
Contact us || Reques1t info<br>
<br>
All rights reserved 2001 Info Edge India Ltd.
</div>
</body>
I have read this posts:
werkzeug.routing.BuildError: Could not build url for endpoint 'success'. Did you forget to specify values ['name']?
How do you get a query string on Flask?
werkzeug.routing.BuildError: Could not build url for endpoint
render_template('index.html', property_id= property_id)
Your index.html does not use property_id. You can discard the property_id argument if index.html indeed do not need it
in index.html, line 14
dropzone.create(action_view='index')
action_url = url_for(action_view, **kwargs)
the later url_for would invoke index() method again, but missed the argument property_id, and moreover it seemed that you are making a recursive call!

Show HTML table with Flask and render_template

I would like to show a table on a website using Google Cloud SQL and Google App Engine.
I am using Flask and pymysql. To show the result of my query I use the render_template of Flask.
I already found other similar topics here (like Topic: Listing table results to HTML with Flask), but I still get an error when I deploy my app. It seems that the error has to do with the for loop.. The error says "jinja2.exceptions.TemplateSyntaxError: tag name expected".
Here's the full error message I get:
ERROR in app: Exception on /analysis [GET]
Traceback (most recent call last): File "/env/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app response = self.full_dispatch_request()
File "/env/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request rv = self.handle_user_exception(e)
File "/env/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception reraise(exc_type, exc_value, tb)
File "/env/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise raise value
File "/env/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request rv = self.dispatch_request()
File "/env/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args)
File "/srv/main.py", line 61, in analysis return render_template("analysis.html", result = result)
File "/env/lib/python3.7/site-packages/flask/templating.py", line 134, in render_template return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list), File "/env/lib/python3.7/site-packages/jinja2/environment.py", line 869, in get_or_select_template return self.get_template(template_name_or_list, parent, globals)
File "/env/lib/python3.7/site-packages/jinja2/environment.py", line 830, in get_template return self._load_template(name, self.make_globals(globals))
File "/env/lib/python3.7/site-packages/jinja2/environment.py", line 804, in _load_template template = self.loader.load(self, name, globals)
File "/env/lib/python3.7/site-packages/jinja2/loaders.py", line 125, in load code = environment.compile(source, name, filename)
File "/env/lib/python3.7/site-packages/jinja2/environment.py", line 591, in compile self.handle_exception(exc_info, source_hint=source_hint)
File "/env/lib/python3.7/site-packages/jinja2/environment.py", line 780, in handle_exception reraise(exc_type, exc_value, tb)
File "/env/lib/python3.7/site-packages/jinja2/_compat.py", line 37, in reraise raise value.with_traceback(tb)
File "/srv/templates/analysis.html", line 23, in template <p class="p1"><span class="s1"><span class="Apple-tab-span"> </span>{% </span><span class="s2">for</span><span class="s1"> r </span><span class="s2">in</span><span class="s1"> result %}</span></p>
File "/env/lib/python3.7/site-packages/jinja2/environment.py", line 497, in _parse return Parser(self, source, name, encode_filename(filename)).parse()
File "/env/lib/python3.7/site-packages/jinja2/parser.py", line 901, in parse result = nodes.Template(self.subparse(), lineno=1)
File "/env/lib/python3.7/site-packages/jinja2/parser.py", line 883, in subparse rv = self.parse_statement()
File "/env/lib/python3.7/site-packages/jinja2/parser.py", line 125, in parse_statement self.fail('tag name expected', token.lineno)
File "/env/lib/python3.7/site-packages/jinja2/parser.py", line 59, in fail raise exc(msg, lineno, self.name, self.filename) jinja2.exceptions.TemplateSyntaxError: tag name expected
My Code in main.py:
import logging
import os
from flask import Flask, render_template
from flask import request
import urllib.request
from urllib.parse import parse_qs, urlparse
import platform
import pymysql
import datetime
db_user = os.environ.get('CLOUD_SQL_USERNAME')
db_password = os.environ.get('CLOUD_SQL_PASSWORD')
db_name = os.environ.get('CLOUD_SQL_DATABASE_NAME')
db_connection_name = os.environ.get('CLOUD_SQL_CONNECTION_NAME')
app = Flask(__name__)
#app.route('/analysis', methods=['GET'])
def analysis():
if os.environ.get('GAE_ENV') == 'standard':
unix_socket = '/cloudsql/{}'.format(db_connection_name)
cnx = pymysql.connect(user=db_user, password=db_password,
unix_socket=unix_socket, db=db_name)
else:
host = '127.0.0.1'
#unix_socket = '/cloudsql/{}'.format(db_connection_name)
cnx = pymysql.connect(user=db_user, password=db_password,
unix_socket=unix_socket, db=db_name)
with cnx.cursor() as cursor:
sql = 'SELECT * FROM content'
cursor.execute(sql)
result = cursor.fetchall()
cnx.close()
return render_template("analysis.html", result = result)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True)
File analysis.html:
<!doctype html>
<table>
<tr>
  <th>contentID</th>
  <th>timestamp</th> 
  <th>clientID</th>
  <th>content</th>
</tr>
{% for r in result %}
<tr>
  <td>{{ r[0] }}</td>
  <td>{{ r[1] }}</td> 
  <td>{{ r[2] }}</td>
  <td>{{ r[3] }}</td>
</tr>
{% endfor %}
</table>
Do you have any suggestions what I can can change to make it work?
Thanks in advance!
One way you can do this is by first have an object, or use pandas to read_csv and then use the dataframe's to_html method.
This saves a ton of time if your data is already formatted correctly:
import pandas as pd
from flask import Flask, render_template
#app.route("/table-page", methods=['GET'])
def table():
data_dic = {
'id': [100, 101, 102],
'color': ['red', 'blue', 'red']}
columns = ['id', 'color']
index = ['a', 'b', 'c']
df = pd.DataFrame(data_dic, columns=columns, index=index)
table = df.to_html(index=False)
return render_template(
"at-leaderboard.html",
table=table)
Now you take the HTML string and paste it into you template without send it as JSON or a dict needing Jinja template formating:
<html>
<body>
<div>
{{ table | safe }}
</div>
</body>
</html>
Based on the stack trace, the text editor you're using for analysis.html isn't a plain text editor. It's saving the file in some other format, making it invalid Jinja2 syntax.
So this line that you see in your editor:
{% for r in result %}
Python will see as (based on the stack trace; added some line breaks for clarity):
<p class="p1">
<span class="s1">
<span class="Apple-tab-span">
</span>
{% </span><span class="s2">for</span><span class="s1"> r </span><span class="s2">in</span><span class="s1"> result %}
</span>
</p>
To fix the problem, open the file analysis.html in a plain text editor and edit it as needed.
{% for r in result %}
<p class="p1">
<span class="s1">
<span class="Apple-tab-span">
</span>
</span><span class="s2">for</span><span class="s1"> {{ r }}</span><span class="s2">in</span><span class="s1">
</span>
</p>
{% endfor %}

How can I save a document from web page on server side?

I'm using apache and python to run my web pages. But when I try to save even a txt file generated on the fly, the file is not saved.
def save(req):
try:
fe1=req.form['fe1']
fe2=req.form['fe2']
file=open("file.txt",'w')
file.write("%s %s" %(fe1,fe2))
file.close()
except KeyError:
fe1=''
fe2=''
view="""
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form method=post action="#">
<input type='text' id='fe1'></input>
<input type='text' id='fe2'></input>
<input type='submit'>
</form>
</body>
</html>
""".format(**locals())
return (view)
After I submi the form I get this:
Mod_python error: "PythonHandler mod_python.publisher"
Traceback (most recent call last):
File "/usr/lib64/python2.7/site-packages/mod_python/apache.py", line 399, in HandlerDispatch
result = obj(req)
File "/usr/lib64/python2.7/site-packages/mod_python/publisher.py", line 222, in handler
published = publish_object(req, object)
File "/usr/lib64/python2.7/site-packages/mod_python/publisher.py", line 446, in publish_object
return publish_object(req, util.apply_fs_data(obj, req.form, req=req))
File "/usr/lib64/python2.7/site-packages/mod_python/util.py", line 642, in apply_fs_data
return object(**args)
File "<string>", line 5, in save
IOError: [Errno 13] Permission denied: 'file.txt'

Image upload error using Bottle

In my code .tpl file:
<form method='post' action='/upload' enctype='multipart/form-data'>
<input type='file' name='newfile'>
<input type='submit' value='Submit'>
</form>
My controller code is:
#app.post('/upload')
def upload():
newfile = request.files.get('newfile')
save_path = os.path.join(config.UPLOAD_DIRECTORY, newfile.filename)
newfile.save(save_path)
return redirect('/')
After browse and submit, I got following 500 error.
Internal Server Error
Exception: AttributeError('save',)
Traceback:
Traceback (most recent call last):
File "/var/www/myproject/bottle.py", line 768, in _handle
return route.call(**args)
File "/var/www/myproject/bottle.py", line 1518, in wrapper
rv = callback(*a, **ka)
File "/var/www/myproject/controllers/index.py", line 753, in upload
newfile.save(save_path)
File "/usr/lib/python2.7/cgi.py", line 521, in __getattr__
raise AttributeError, name
AttributeError: save
Could someone know what this issue is?
Oh I see a problem...
return redirect('/')
Should be:
redirect('/')
That could what is generating your 500 issue.

BadValueError: Property text is required

I've done a lot of research trying to solve this problem myself but I am running up short of a solution. If anyone can give me any pointer or help I would really appreciate it.
I am creating a blog that has basic blog functionality such as; likes, dislikes, posts, comments, multiple users, CRUD functions etc. I have so far been able to overcome most of my problems and I am near the completion of this project.
The last bit of trouble I am having is with my Edit Comment functionality, I can delete a comment just fine but if I try to update a comment I got the following error:
ERROR 2017-03-08 14:26:21,907 wsgi.py:279]
Traceback (most recent call last):
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1519, in __call__
response = self._internal_error(e)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
rv = self.handle_exception(request, response, e)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/home/crow/UdacityProjects/blog/blog.py", line 424, in post
comment.text = self.request.get('comment_text')
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/google/appengine/ext/db/__init__.py", line 617, in __set__
value = self.validate(value)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/google/appengine/ext/db/__init__.py", line 2810, in validate
value = super(UnindexedProperty, self).validate(value)
File "/home/crow/Downloads/google-cloud-sdk/platform/google_appengine/google/appengine/ext/db/__init__.py", line 644, in validate
raise BadValueError('Property %s is required' % self.name)
BadValueError: Property text is required
Now I am not exactly sure why this is happening, I looked up the solutions that others were finding for similar problems and none seemed to apply to my situation. Here is my relevant code for reference:
EditComment(BlogHandler)
class EditComment(BlogHandler):
def get(self, post_id, comment_id):
post = Post.get_by_id(int(post_id), parent=blog_key())
comment = Comment.get_by_id(int(comment_id))
if comment:
if comment.user.name == self.user.name:
self.render("editcomment.html", comment_text=comment.text)
else:
error = "You may only edit your own comments"
self.render("editcomment.html", edit_error=error)
else:
error = "This comment no longer exists"
self.render("editcomment.html", edit_error=error)
def post(self, post_id, comment_id):
if self.request.get("update_comment"):
comment = Comment.get_by_id(int(comment_id))
if comment.user.name == self.user.name:
comment.text = self.request.get('comment_text')
comment.put()
time.sleep(0.1)
self.redirect('/post/%s' % str(post_id))
else:
error = "you may only edit your own comments"
self.render(
"editcomment.html",
comment_text=comment.text,
edit_error=error)
elif self.request.get("cancel"):
self.redirect('/post/%s' % str(post_id))
Comment(db.model)
class Comment(db.Model):
user = db.ReferenceProperty(User, required=True)
post = db.ReferenceProperty(Post, required=True)
created = db.DateTimeProperty(auto_now_add=True)
text = db.TextProperty(required=True)
#classmethod
def cdb_blog_id(cls, blog_id):
c = Comment.all().filter('post =', blog_id)
return c.count()
#classmethod
def adb_blog_id(cls, blog_id):
c = Comment.all().filter('post =', blog_id).order('created')
return c
editcomment.html
{% extends "base.html" %}
{% block content %}
<div class="twelve columns">
<h3>Edit Comment</h3>
<hr>
<div class="row">
<div class="twelve columns">
<form method="post">
<label>
<textarea class="u-full-width" name="text" id="texta2">{{comment_text}}</textarea>
</label>
<div class="error">{{edit_error}}</div>
<input type="submit" class="button" name="update_comment" value="Update">
<input type="submit" class="button" name="cancel" value="Cancel">
</form>
</div>
</div>
</div>
{% endblock %}
Now the traceback does not point to the area in my code that is causing the issue so I will provide the relevant lines of the __inti__.py file here:
Line 617
def __set__(self, model_instance, value):
"""Sets the value for this property on the given model instance.
See http://docs.python.org/ref/descriptors.html for a description of
the arguments to this class and what they mean.
"""
value = self.validate(value)
setattr(model_instance, self._attr_name(), value)
Line 2810
raise BadValueError('Property %s must be convertible '
'to a %s instance (%s)' %
(self.name, self.data_type.__name__, err))
value = super(UnindexedProperty, self).validate(value)
if value is not None and not isinstance(value, self.data_type):
raise BadValueError('Property %s must be a %s instance' %
(self.name, self.data_type.__name__))
return value
Line 644
if self.empty(value):
if self.required:
raise BadValueError('Property %s is required' % self.name)
I'm not sure what I'm doing wrong here, and if anyone would be able to offer me any kind of advice I would be very grateful. Thanks again
The error indicates that the value you get from self.request.get('comment_text') and pass to comment.text is invalid - None probably.
The check is done because the text property has the option required set to True in the Comment model.
So check that you properly pass the 'comment_text' request parameter (or its value) around.
Maybe you need name="comment_text" in the following line from editcomment.html?
<textarea class="u-full-width" name="text" id="texta2">{{comment_text}}</textarea>

Categories