Reputation: 1394
My code is this:
import webapp2
import re
form = """<html>
<form method=post>
<input name="username"><div id=div>%s</div><br>
<input name="password"><div id=div>%s</div><br>
<input name="verify"><div id=div>%s</div><br>
<input name="email"><div id=div>%s</div>
<input type="submit">
</form>
</html>"""
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
self.response.write(form % ('','','',''))
def reply(self,user,password,verify,email):
if not user and password and verify and email:
self.redirect('/broski')
else:
self.response.write(form % (user,password,verify,email))
def post(self):
self.usererror = ''
if not re.compile(r"^[a-zA-Z0-9_-]{3,20}$").match(self.request.get('username')):
self.usererror = "That's not a valid username."
self.passworderror = ''
if not re.compile(r"^.{3,20}$").match(self.request.get('password')):
self.passworderror = "That wasn't a valid password."
self.verifyerror = ''
if self.request.get('verify') != self.request.get('password') and self.request.get('password') != '':
self.verifyerror = "Your passwords didn't match."
self.emailerror = ''
if not re.compile(r"^[\S]+@[\S]+\.[\S]+$").match(self.request.get('email')):
self.emailerror = "That's not a valid email."
self.reply(usererror,passworderror,verifyerror,emailerror)
class ThankYo(webapp2.RequestHandler):
def get(self):
self.response.write('Welcome, ' + self.request.get('username')+'!')
app = webapp2.WSGIApplication([('/', MainPage),('/broski', ThankYo)],
debug=True)
It is literally my first time writing a code for GAE(And im new to python..) larger than 10 lines and, ofcourse, he broke. I found several bugs but to absolutely on help as the website still doesnt even load. Help regarding the code is highly appreciated. Update: I updated it a little bit more(Changed inheritance of ThankYo) and now the form successfully loads, as soon as i post the data ofcourse it crashes...
Upvotes: 0
Views: 64
Reputation: 879251
class ThankYo(Mainpage):
should be
class ThankYo(MainPage):
(note the capital P
).
I found this by looking at the error messages left in the terminal:
% dev_appser File "/home/unutbu/pysrc/project/main.py", line 38, in <module>
...
class ThankYo(Mainpage):
NameError: name 'Mainpage' is not defined
Also change
self.reply(usererror,passworderror,verifyerror,emailerror)
to
self.reply(self.usererror, self.passworderror, self.verifyerror, self.emailerror)
I found this again by looking at the terminal error message:
File "/home/unutbu/pysrc/project/main.py", line 39, in post
self.reply(usererror, passworderror, verifyerror, emailerror)
NameError: global name 'usererror' is not defined
How to see error messages (from the terminal):
There is more than one way to start the GAE server. The way I do it is by opening a terminal and running
dev_appserver.py /path/to/project/
The terminal then spews useful error messages.
The last problem is a bit more complex. We are sending error messages to the reply
method:
self.reply(self.usererror, self.passworderror, self.verifyerror, self.emailerror)
But in the reply
method definition we call them user
, password
, verify
and email
. That causes a bit of cognitive dissonance. Let's rename them usererror
, passworderror
, verifyerror
and emailerror
:
def reply(self, usererror, passworderror, verifyerror, emailerror):
Now to check that there are no errors use:
if not any(usererror and passworderror and verifyerror and emailerror):
But the page we want to redirect to needs the name of the user!
If we just redirect to /broksi
:
self.redirect('/broski')
then the ThankYo
handler has no idea what the username is. self.request.get('username')
would come up blank (return an empty string). So we need to pass along the username to broski
:
import urllib
self.redirect('/broski?' + urllib.urlencode(
{'username' : self.username}))
So the code ends up looking like this:
import urllib
import webapp2
import re
form = """<html>
<form method=post>
<input name="username"><div id=div>%s</div><br>
<input name="password"><div id=div>%s</div><br>
<input name="verify"><div id=div>%s</div><br>
<input name="email"><div id=div>%s</div>
<input type="submit">
</form>
</html>"""
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
self.response.write(form % ('', '', '', ''))
def reply(self, usererror, passworderror, verifyerror, emailerror):
if not any(usererror and passworderror and verifyerror and emailerror):
self.redirect('/broski?' + urllib.urlencode(
{'username' : self.username}))
else:
self.response.write(form % (user, password, verify, email))
def post(self):
self.username = self.request.get('username')
self.password = self.request.get('password')
self.verify = self.request.get('verify')
self.email = self.request.get('email')
self.usererror = ''
if not re.compile(r"^[a-zA-Z0-9_-]{3,20}$").match(self.username):
self.usererror = "That's not a valid username."
self.passworderror = ''
if not re.compile(r"^.{3,20}$").match(self.password):
self.passworderror = "That wasn't a valid password."
self.verifyerror = ''
if self.verify != self.password and self.password != '':
self.verifyerror = "Your passwords didn't match."
self.emailerror = ''
if not re.compile(r"^[\S]+@[\S]+\.[\S]+$").match(self.email):
self.emailerror = "That's not a valid email."
self.reply(self.usererror, self.passworderror, self.verifyerror, self.emailerror)
class ThankYo(MainPage):
def get(self):
self.response.write('Welcome, ' + self.request.get('username') + '!')
app = webapp2.WSGIApplication([('/', MainPage), ('/broski', ThankYo)],
debug=True)
Upvotes: 1