Google AppEngine Tutorial, difference between code snippets - google-app-engine

can anyone tell me please the difference between these two code snippets:
1.
import webapp2
from google.appengine.api import users
class MainPage(webapp2.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())
else:
self.redirect(users.create_login_url(self.request.uri))
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
2.
import webapp2
from google.appengine.api import users
class MainPage(webapp2.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())
else:
self.redirect(users.create_login_url(self.request.uri))
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
The thing is that i'm trying to go over Google AppEngine introduction material and whenever i try to type the code myself, something's different and it doesn't work. And whenever i just copy it from their website, it works, although it looks identical.
Checked the coding in the View panel, it's same, ANSI (i'm using Notepad++).
Tried to play with indentation as well and it didn't made any difference.
Any comments would be appreciated.
Thank you.

You should always start your Pyhton code with these 3 lines:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
And your editor should encode in utf-8. Do not use ANSI.
The last line is optional, but I recommend it, to stay away from encoding problems. There are a few exceptions. So if you use unicode literals, you have to change the line with the headers:
import webapp2
from google.appengine.api import users
class MainPage(webapp2.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
self.response.headers['Content-Type'.encode()] = 'text/plain'.encode()
self.response.out.write('Hello, ' + user.nickname())
else:
self.redirect(users.create_login_url(self.request.uri))
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
And your app.yaml should look like:
application: helloworld
version: 1
runtime: python27
api_version: 1
threadsafe: false
handlers:
- url: /.*
script: helloworld.app
libraries:
- name: webapp2
version: latest
But Notepad++ is not a good development environment for app engine. You need a good Python IDE. I recommend Eclipse with PyDev. To setup, use this totorial see this question: Debug google app engine project line by line
And if you are a total newbie? go to this great web development course using google app engine : http://www.udacity.com/overview/Course/cs253/CourseRev/apr2012

Found a problem, it was indentation thing.
You can read about this here and here
There's difference whether you are using "space" or "tab" to indent and it can cause problems,
also problems can occur from settings in your program (in my case in Sublime Text's setting of "Tab" indent,it can be set to 4 or 8 etc.)

Related

Using Google App Engine how do I open an html page?

Using Google App Engine I hope to learn some very basic knowledge with this question. I want to be able to open an index.html page that is placed in a folder when I open the application.
I generated a new application using 'Google App Engine Launcher'
I slightly modified the app.yaml and it now looks like the following...
application: helloworld
version: 1
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: /templates
static_dir: templates
- url: .*
script: main.app
libraries:
- name: webapp2
version: "2.5.2"
I also have a added a directory called 'templates'.
In the directory I placed a file called 'index.html'.
<html>
<header><title>This is title</title></header>
<body>
Hello world cls
</body>
</html>
My main.py hasn't been modified so it looks like
#!/usr/bin/env python
#
import webapp2
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world!')
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
Any ideas on what I need to do or change to find success?
Regards,
Chris
>
My code has changed in a big way because of a comment from Gwyn
I now have the standard Django template code from link (https://console.developers.google.com/start/appengine)
Gwyn eventually the index.html file will be something a little more than a static page so a direct URL that you described won't work. You did teach me though and that will come in handy as I progress. I want to bring in some Polymer code once I get the basics figured out here...
So if anyone can help me feed up a hello world from within a 'templates' folder using an index.html page from a standard django codeset generated from the Google Developers Console then your answer would be very much appreciated here.
Regards,
Chris
First, to use HTML, do you need a template engine, in app engine you can use this EZT, Cheetah, ClearSilver, Quixote, Django, and Jinja2 but for simplicity, you can modify your code to send the html directly
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('<html><header><title>This is title</title></header><body>Hello world cls</body></html>')
application = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
But as Gwyn Howell says, for more complicated stuff you must use a template engine
I wanted to update this so if anyone else is struggling they may find success also...
I want to thank both of Gwyn Howell and Kristian Damian. I used both of your comments to come up with an answer for anyone else that has the same question.
I went to clarify that I am using the downloaded Python SDK for Google App Engine
I made a sample python project using File|Create New Application - Python 2.7
I ran the project to make sure it was working without any of my changes
I then decided I would use 'Jinja2' for my template engine
I made a 'templates' folder and placed my 'about_v2.html' file in it
I modified the 'app.yaml' code to read
application: helloworld
version: 2
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: .*
script: main.app
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
I modified the 'main.py' code to read
import os
import webapp2
import jinja2
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),
'templates')))
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write('Hello world! About.<br />')
class AboutPage_v2(webapp2.RequestHandler):
def get(self):
template_values = {
}
template = env.get_template('about_v2.html')
self.response.out.write(template.render(template_values))
app = webapp2.WSGIApplication([
('/', MainHandler),
('/about_v2.html', AboutPage_v2)],
debug=True)
I then ran the project on my local machine and was able to get to the url
I hope this answer helps someone else.

How to stop Google App Engine Launcher logging the whole html content?

I use the following code to use webapp2
import webapp2
from webapp2_extras import i18n, jinja2
class Test(webapp2.RequestHandler):
#webapp2.cached_property
def jinja2(self):
# Returns a Jinja2 renderer cached in the app registry.
return jinja2.get_jinja2(app=self.app)
def render(self, _template, **context):
# Renders a template and writes the result to the response.
rv = self.jinja2.render_template(_template, **context)
self.response.write(rv)
def get(self):
self.render('index2.html')
app = webapp2.WSGIApplication([('/',Test)], debug=False)
app.run()
To be simple, we just make index2.html is full of 1000 test
If you run it, you will find that the Google App Engine Launcher log windows is full of test.
It's rather terrible when you are debugging a real website.
But I find that if index2.html contains just few words like 10 test. The test will not appear in logging window.
Any solution?
It looks like you are running two separate instances of your application.
The first is running through the development server, the second is actually running and outputting to the terminal. You can see this by adding a log output to your application. You can see that when you go to your site, the log is written two twice.
You can fix this by removing the line:
app.run()
This is not necessary when running on App Engine. Your app.yaml file references the app directly:
handlers:
- url: .*
script: guestbook.app # Notice the .app here.

Google App Engine import NLTK error

I am trying to import NLTK library in Google App Engine it gives error, I created another module "testx.py" and this module works without error but I dont know why NLTK does not work.
My code
nltk_test.py
import webapp2
import path_changer
import testx
import nltk
class MainPage(webapp2.RequestHandler):
def get(self):
#self.response.headers['Content-Type'] = 'text/plain'
self.response.write("TEST")
class nltkTestPage(webapp2.RequestHandler):
def get(self):
text = nltk.word_tokenize("And now for something completely different")
self.response.write(testx.test("Hellooooo"))
application = webapp2.WSGIApplication([
('/', MainPage), ('/nltk', nltkTestPage),
], debug=True)
testx.py code
def test(txt):
return len(txt)
path_changer.py code
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'nltk'))
sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'new'))
app.yaml
application: nltkforappengine
version: 0-1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: nltk_test.application
- url: /nltk.*
script: nltk_test.application
libraries:
- name: numpy
version: "1.6.1"
This code works fine When I comment the import nltk and nltk related code, I think NLTK is not imported, please help me to sort out this problem, thanks
Where do you have nltk installed?
GAE libraries need to be available in your app folder. If you have nltk elsewhere in your pythonpath it won't work.

How to use use_library('django','1.2')

I'm learning developing in Google App Engine.
This is one of the code from the tutorial, http://code.google.com/appengine/docs/python/gettingstarted/usingwebapp.html
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
I've almost identical code. I sometime get warning:
WARNING 2011-06-30 13:10:44,443 init.py:851] You are using the default Django version (0.96). The default Django version will change in an App Engine release in the near future. Please call use_library() to explicitly select a Django version. For more information see http://code.google.com/appengine/docs/python/tools/libraries.html#Django
Can anyone please re factor the above code with use_library(). I'm not sure how to start and where to use use_library and what to do with webapp.
Thanks in advance.
The above code should not require you to call use_library directly.
If you create a new file in the root directory of your application named appengine_config.py and add the following line to it:
# Make webapp.template use django 1.2
webapp_django_version = '1.2'
try putting this code on top of your module :
import os
from google.appengine.dist import use_library
use_library('django', '1.2')
In the current version this is even simpler as third-party libraries are now specified in app.yaml
libraries:
- name: django
version: "1.2"
You can also use webapp2 that includes Django’s templating engine.
import webapp2
from google.appengine.ext.webapp2 import template

URL with trailing slash in Google App Engine

This is my app.yaml:
- url: /about|/about/.*
script: about.py
This is my `about.py':
application = webapp.WSGIApplication([(r'^/about$', AboutPage),
(r'^/about/$', Redirect),
(r'.*', ErrorPage)],
debug = True)
I want to redirect all requests for /about/ to /about. I'd like all other requests to be sent to the error page.
It works in the development server on localhost, but I cannot access /about/ after I deployed the app on GAE - it just shows an empty page.
I adjusted the order of URL patterns in app.yaml.
It works now on GAE.
If you don't want trailing slashes for GET requests anywhere in your application, you can implement a global redirect at the top of your app.yaml. Note that POST requests will NOT redirect, but this is ok (for me anyway) because users don't generally hand-write POST URLs.
app.yaml:
application: whatever
version: 1
api_version: 1
runtime: python
handlers:
- url: .+/
script: slashmurderer.py
slashmurderer.py
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class SlashMurdererApp(webapp.RequestHandler):
def get(self, url):
self.redirect(url)
application = webapp.WSGIApplication(
[('(.*)/$', SlashMurdererApp)]
)
def main():
run_wsgi_app(application)
I see that this question has already been answered, but I ran into the same problem and wanted to see if there was a "lazier" solution.
If you're using the Python 2.7 runtime, then the webapp2 library is available, and I believe the following will work:
import webapp2
from webapp2_extras.routes import Redirect Route
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.out.write("This is my first StackOverflow post")
app = webapp2.WSGIApplication([
RedirectRoute('/', MainHandler, name='main', strict_slash=True),
('/someurl', OtherHandler),
])
strict_slash=True means that if the client doesn't supply the slash it will be redirected to the url with the slash (to match the first argument).
You can combine the special Route classes from webapp2_extras with normal (regex, handler) tuples as shown above. The "name" parameter is required for the constructor for RedirectRoute. More details here: webapp2_extras documentation for RedirectRoute

Resources