搜尋

首頁  >  問答  >  主體

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

PHP中文网PHP中文网2767 天前441

全部回覆(5)我來回復

  • PHP中文网

    PHP中文网2017-04-17 14:38:35

    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()
    

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:38:35

    不用現成的ORM的話,可以自己學著寫一個撒。 。自己寫的話可以參考下廖神的編寫ORM

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 14:38:35

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:38:35

    可以參考Flask的官方例子: minitwit, 不過資料庫用的是 sqlite

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 14:38:35

    不是有教程麼? 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'))

    回覆
    0
  • 取消回覆