怎么用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什么的,便于比较学习。先说声谢谢了

阅读 38.2k
评论
    5 个回答
    • 1.7k

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

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

      不是有教程么?http://docs.jinkan.org/docs/f...

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

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

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

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

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

      例子

      from functools import wraps
      def authorize(fn):
          @wraps(fn)
          def wrapper(*args, **kwds):
              user = session.get('logged_in', None)
              if user:
                  return fn(user=user)
              else:
                  return redirect(url_for('signin',next=request.path))
      
          return wrapper
          
      
      @app.route('/home')
      @authorize
      def home(**kwds):
          username = kwds['user']
          return render_template('index.html' ,username=username)
          
      #加密存储密码
      import os
      import hashlib
      def encrypt_password(password, salt=None, encryptlop=30):
          if not salt:
              salt = os.urandom(16).encode('hex') # length 32
          for i in range(encryptlop):
              password = hashlib.sha256(password + salt).hexdigest() # length 64
          return password, salt
          
      #简单的错误处理
      class loginError(Exception):
          def __init__(self, value):
              self.value = value
          def __str__(self):
              return repr(self.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_password(request.form['password'])
              g.db.cursor.execute('INSERT INTO users (name,password,salt) VALUES (%s,%s,%s)',(u,p,s,)
              g.db.commit()
              return redirect(url_for('signin'))
              
      @app.route('/signin/', methods=['GET','POST'])
      def signin():
          if request.method == 'GET':
              referrer = request.args.get('next','/')
              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.execute('SELECT `name` FROM users WHERE name = %s',(u,))
                  if not g.db.cursor.fetchone():
                      raise loginError(u'错误的用户名或者密码!')
                  g.db.cursor.execute('SELECT `salt`,`password` FROM users WHERE name = %s',(u,))
                  salt,password = g.db.cursor.fetchone()
                  if encrypt_password(p,salt)[0] == password:
                      session['logged_in'] = u
                      return redirect(next)
                  else:
                      raise loginError(u'错误的用户名或者密码!')
              except loginError as e:
                  return render_template('login.html', next=next,error=e.value)
      
      @app.route('/signout/', methods=['POST'])
      def signout():
          session.pop('logged_in', None)
          return redirect(url_for('home'))

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

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

            • 1.7k

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

              撰写回答

              登录后参与交流、获取后续更新提醒