怎么用flask+mysql来实现一个简单的用户注册和登陆效果的页面呢?请不要用任何ORM

首先,请不要用任何ORM(当然SQLAlchemy,Flask-SQLAlchemy也不要用)
初学flask,于是参照http://dormousehole.readthedocs.org/en/latest/tutorial/introduction.ht…
实际用到的关键代码在这里:https://github.com/mitsuhiko/flask/blob/0.10.1/examples/flaskr/flaskr….
发现网上都是用的sqlite3,或者就是mysql+Flask-SQLAlchemy之类的。
然后很痛苦,本来一个连flask+mysql做用户注册和登陆的效果都不会实现的人,怎么可能轻易看的懂flask+mysql+mysql+Flask-SQLAlchemy的呢。
问了群里好多人,都说用mysql跟sqlite3是一样的,可是我发现多少是有些区别,至少自己搞了一周还是没搞定,不知从何弄起,感觉好痛苦。
可否有大神帮忙弄一个成功的,代码分享下。不胜感激啊!
最好是先一份flask+mysql,再来一份flask+mysql+Flask-SQLAlchemy什么的,便于比较学习。先说声谢谢了

SQL会写吧?
如果这都看不懂,就先不要折腾了,复习下基础,磨刀不误砍柴工.

pythonimport os, sys, string
import MySQLdb # 连接数据库 try: conn = MySQLdb.connecthost=localhost,user=root,passwd=xxxx,db=test1
except Exception, e: print e sys.exit # 获取cursor对象来进行操作
cursor = conn.cursor
# 创建表
sql = "create table if not exists test1name varchar128 primary key, age int4"
cursor.executesql
# 插入数据
sql = "insert into test1name, age values %s, %d" % "zhaowei", 23
try: cursor.executesql
except Exception, e: print e sql = "insert into test1name, age values %s, %d" % "张三", 21
try: cursor.executesql
except Exception, e: print e # 插入多条
sql = "insert into test1name, age values %s, %s"
val = "李四", 24, "王五", 25, "洪六", 26
try: cursor.executemanysql, val
except Exception, e: print e #查询出数据
sql = "select * from test1"
cursor.executesql
alldata = cursor.fetchall
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata: for rec in alldata: print rec[0], rec[1] cursor.close
conn.close

不用现成的ORM的话,可以自己学着写一个撒。。自己写的话可以参考下廖神的编写ORM

python和mysql连接的方式有很多吧?连接上了,不用orm,直接sql不也行么?

可以参考Flask的官方例子: minitwit, 不过数据库用的是 sqlite

不是有教程么?http://docs.jinkan.org/docs/flask/tutorial/index.html

一个简单的用户注册和登录的页面,就两个部分。

  1. 涉及到数据库,存储用户数据(注册),读出用户数据(登录验证)。搞清楚如何用python连接和操作数据库即可,还有了解sql数据库语句,sqlite和mysql差不多的,看几眼多试几下就了解了。

  2. 网站程序,前端如何发送表单(别告诉这你也不清楚?)后端获取用户发送的请求,和数据库中数据验证是否能够登录,然后登录后如何保存用户登录信息,就是使用的cookie,不过在flask中是session(其实session也是cookie,flask把它封装了下,成了加密的cookie)

总之如果你认真跟着官方的教程走过一遍。只是完成用户登录和注册的功能都不难的。虽然这些知识点都不烂,但是覆盖范围还比较广泛。数据库,前端的html,后端的程序框架,你对其中一项不太了解都会让你有种无法下手的感觉。

好吧。丢一段验证登录代码上来,因为flask的路由是通过绑定一个个函数来实现的,如果你要在给每个路由都添加一段验证登录的代码还是蛮麻烦的,不过通过装饰器这个功能实现起来还是蛮方便的

例子

pythonfrom functools import wraps
def authorizefn: @wrapsfn def wrapper*args, **kwds: user = session.getlogged_in, None if user: return fnuser=user else: return redirecturl_forsignin,next=request.path return wrapper @app.route/home
@authorize
def home**kwds: username = kwds[user] return render_templateindex.html ,username=username #加密存储密码
import os
import hashlib
def encrypt_passwordpassword, salt=None: if not salt: salt = os.urandom16.encodehex # length 32 result = password for i in range3: result = hashlib.sha256password + salt.hexdigest[::2] #length 32 return result, salt #简单的错误处理
class loginErrorException: def __init__self, value: self.value = value def __str__self: return reprself.value # 注册登录(下面的代码没有实际运行过)
# 连接数据库我是使用的是 mysql.connector # http://dev.mysql.com/downloads/connector/python/
# 写法和常用的MySQL-python稍有所不同
# 下面没有连接数据库的代码 @app.route/register/, methods=[GET,POST]
def request: if request.method == GET: return render_template"register.html" if request.method == POST: # 这里最好需要验证用户输入,我就不写了 u = request.form[username] p,s = encrypt_passwordrequest.form[password] g.db.cursor.executeINSERT INTO users name,password,salt VALUES %s,%s,%s,u,p,s, g.db.commit return redirecturl_forsignin @app.route/signin/, methods=[GET,POST]
def signin: if request.method == GET: referrer = request.args.getnext,/ return render_template"login.html",next=referrer if request.method == POST: u = request.form[username] p = request.form[password] n = request.form[next] try: g.db.cursor.executeSELECT `name` FROM users WHERE name = %s,u, if not g.db.cursor.fetchone: raise loginErroru错误的用户名或者密码! g.db.cursor.executeSELECT `salt`,`password` FROM users WHERE name = %s,u, salt,password = g.db.cursor.fetchone if encrypt_passwordp,salt[0] == password: session[logged_in] = u return redirectnext else: raise loginErroru错误的用户名或者密码! except loginError as e: return render_templatelogin.html, next=next,error=e.value @app.route/signout/, methods=[POST]
def signout: session.poplogged_in, None return redirecturl_forhome

发表评论

电子邮件地址不会被公开。 必填项已用*标注