flask做的一個非常簡單的項目,記錄,flask+mysql(原生sql語句)

環境:pycharm + python2.7.15

完成功能:
郵件發送,以及文件上傳,以及對數據庫的增刪查操作

備註:我不是寫flask的,只是臨時需要,寫了一個小demo差不多的,方便以後查閱

管理員功能介紹:

		查找,增加,刪除,文件上傳(上傳到static/images目錄)

在這裏插入圖片描述

用戶功能介紹

		註冊,登陸,郵件發送找回密碼

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

代碼:

在這裏插入圖片描述

12161.py

#!/usr/bin/python3.5
# -*- coding: UTF-8 -*-
# 導入數據庫模塊
import pymysql
import time,datetime
# 導入Flask框架,這個框架可以快捷地實現了一個WSGI應用
from flask import Flask,flash
# 默認情況下,flask在程序文件夾中的templates子文件夾中尋找模塊
from flask import render_template
# 導入前臺請求的request模塊
from flask import request, Response,redirect,session,jsonify
import traceback
from flask_sqlalchemy import SQLAlchemy

from flask_mail import Mail, Message
import  cv2
import time
import os
from werkzeug.utils import secure_filename


from models import User

#設置允許的文件格式
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])



def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

# 傳遞根目錄
app = Flask(__name__)
app.secret_key = '12161'
app.config['DEBUG']=True


# 默認路徑訪問登錄頁面
@app.route('/')
def login():
    return render_template('login.html')


# 默認路徑訪問註冊頁面
@app.route('/regist')
def regist():
    return render_template('regist.html')

@app.route('/logout')
def logout():
    return render_template('login.html')



# 設置響應頭
def Response_headers(content):
    resp = Response(content)
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp


# 獲取註冊請求及處理
@app.route('/registuser')
def getRigistRequest():
    # 把用戶名和密碼註冊到數據庫中

    # 連接數據庫,此前在數據庫中創建數據庫TESTDB
    db = pymysql.connect("localhost", "root", "123456", "lesson")
    # 使用cursor()方法獲取操作遊標
    cursor = db.cursor()
    # SQL 插入語句
    sql = "INSERT INTO person(name, psd,age) VALUES (" + request.args.get('username') + ", " + request.args.get(
        'password1') + ", " + request.args.get('age')+" )"
    try:
        # 執行sql語句
        cursor.execute(sql)
        # 提交到數據庫執行
        db.commit()
        # 註冊成功之後跳轉到登錄頁面
        flash("註冊成功")
        return render_template('login.html')
    except:
        # 拋出錯誤信息
        traceback.print_exc()
        # 如果發生錯誤則回滾
        db.rollback()
        return '註冊失敗'
    # 關閉數據庫連接
    db.close()


# 獲取登錄參數及處理
@app.route('/login')
def getLoginRequest():
    # 查詢用戶名及密碼是否匹配及存在
    # 連接數據庫,此前在數據庫中創建數據庫TESTDB
    db = pymysql.connect("localhost", "root", "123456", "lesson")
    # 使用cursor()方法獲取操作遊標
    cursor = db.cursor()
    # SQL 查詢語句
    sql = "select * from person where name="+request.args.get('name')+" and psd="+request.args.get('psd')+""
    try:
        # 執行sql語句
        cursor.execute(sql)
        results = cursor.fetchall()
        print(len(results))
        if len(results) == 1:
            # return '登錄成功'
            User.name = request.args.get('name')
            User.psd = request.args.get('psd')
            username = request.args.get('name')
            userpsd = request.args.get('psd')

            session['username'] = username

            print(User.name + " "+User.psd)
            return render_template('main1.html',name=request.args.get('name'))
        else:
            return '用戶名或密碼不正確'
        # 提交到數據庫執行
        db.commit()
    except:
        # 如果發生錯誤則回滾
        traceback.print_exc()
        db.rollback()
    # 關閉數據庫連接
    db.close()

# 查詢數據庫所有零食信息
@app.route('/all')
def all():
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', db='lesson', charset='utf8')
    cur = conn.cursor()
    sql = "SELECT * FROM thing"
    cur.execute(sql)
    conn.commit()
    u = cur.fetchall()
    conn.close()
    return render_template('main2.html', u=u)


# 增加零食
@app.route('/add', methods=['POST', 'GET'])
def add():
    # # 把用戶名和密碼註冊到數據庫中
    #
    # # 連接數據庫,此前在數據庫中創建數據庫TESTDB
    # db = pymysql.connect("localhost", "root", "123456", "lesson")
    # # 使用cursor()方法獲取操作遊標
    # cursor = db.cursor()
    # # SQL 插入語句
    # sql = "INSERT INTO thing VALUES (   '" + request.args.get('name') + "'  , '" + request.args.get( 'price')+"' )"
    # print(sql)
    #
    # # 執行sql語句
    # cursor.execute(sql)
    # # 提交到數據庫執行
    # db.commit()
    # db.close()
    # # 註冊成功之後跳轉到登錄頁面
    # flash("增加成功")

    if request.method == 'POST':
        f = request.files['file']

        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "請檢查上傳的圖片類型,僅限於png、PNG、jpg、JPG、bmp"})

        name = request.form.get("name")
        price = request.form.get("price")

        basepath = os.path.dirname(__file__)  # 當前文件所在路徑

        upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename))  # 注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑
        # upload_path = os.path.join(basepath, 'static/images','test.jpg')  #注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑
        f.save(upload_path)

        # 使用Opencv轉換一下圖片格式和名稱
        img = cv2.imread(upload_path)
        filename = name + '.jpg'
        cv2.imwrite(os.path.join(basepath, 'static/images',filename), img)

        db = pymysql.connect("localhost", "root", "123456", "lesson")
        # 使用cursor()方法獲取操作遊標
        cursor = db.cursor()
        # SQL 插入語句
        sql = "INSERT INTO thing VALUES (   '" + name + "'  , '" + price+"' )"
        print(sql)

        # 執行sql語句
        cursor.execute(sql)
        # 提交到數據庫執行
        db.commit()
        db.close()

        return redirect("/all")
    return redirect("/all")




@app.route('/delete/')
def delete():
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', db='lesson', charset='utf8')
    cur = conn.cursor()
    name = request.args.get("name")
    # print(name)
    # sql= "delete from thing"
    sql = "delete from thing where name='%s' " % (name)
    print(sql)
    cur.execute(sql)
    # 關閉數據庫連接
    conn.commit()
    conn.close()
    return redirect("/all")

@app.route('/forget')
def forget():
    return render_template('forget.html')

#使用QQ郵箱服務器
app.config['MAIL_SERVER']='smtp.qq.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = '發送者郵箱'
app.config['MAIL_PASSWORD'] = '發送者郵箱的密碼'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)

@app.route('/forget1')
def forget1():
    conn = pymysql.connect("localhost", "root", "123456", "lesson")
    cursor = conn.cursor()

    email = request.args.get('email')
    name = request.args.get('name')

    sql = "update person set psd = '123456' where name = '"+name+"'"
    print(sql)
    cursor.execute(sql)
    # 關閉數據庫連接
    conn.commit()
    conn.close()

    msg = Message('修改密碼', sender='[email protected]', recipients=[email])
    msg.body = "您的密碼已經被修改爲123456,請登錄修改密碼"
    mail.send(msg)
    return redirect("/")


@app.route('/userallfood')
def userallfood():
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', db='lesson', charset='utf8')
    cur = conn.cursor()
    sql = "SELECT * FROM thing"
    cur.execute(sql)
    conn.commit()
    u = cur.fetchall()
    conn.close()
    return render_template('userallfood.html', u=u)

@app.route('/buy/')
def buy():
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', db='lesson', charset='utf8')
    cur = conn.cursor()
    # 獲得要購買的零食名字
    name = request.args.get("name")
    # 獲得用戶名
    username= session.get('username')
    # print ('當前登錄用戶:'+username)

    time = datetime.datetime.now()
    stringtime = str(time)
    print(stringtime)
    sql = "INSERT INTO guanxi VALUES (   '" + username + "'  , '" + name + "','"+stringtime+"' )"

    print(sql)
    cur.execute(sql)
    # 關閉數據庫連接
    conn.commit()
    conn.close()
    return redirect("/userallfood")



@app.route('/userbuyrecord')
def userbuyrecord():
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', db='lesson', charset='utf8')
    cur = conn.cursor()
    # 獲得用戶名
    username = session.get('username')

    sql = "SELECT * FROM guanxi where name = '"+username+"'"
    cur.execute(sql)
    conn.commit()
    u = cur.fetchall()
    conn.close()
    return render_template('userbuyrecord.html', u=u)


@app.route('/upload', methods=['POST', 'GET'])  # 添加路由
def upload():
    if request.method == 'POST':
        f = request.files['file']

        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "請檢查上傳的圖片類型,僅限於png、PNG、jpg、JPG、bmp"})

        user_input = request.form.get("name")

        basepath = os.path.dirname(__file__)  # 當前文件所在路徑

        upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename))  # 注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑
        # upload_path = os.path.join(basepath, 'static/images','test.jpg')  #注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑
        f.save(upload_path)

        # 使用Opencv轉換一下圖片格式和名稱
        img = cv2.imread(upload_path)
        cv2.imwrite(os.path.join(basepath, 'static/images', 'test.jpg'), img)

        return render_template('upload_ok.html', userinput=user_input, val1=time.time())

    return render_template('upload.html')



# 使用__name__ == '__main__'是 Python 的慣用法,確保直接執行此腳本時才
# 啓動服務器,若其他程序調用該腳本可能父級程序會啓動不同的服務器
if __name__ == '__main__':
    app.run(debug=True)

main2.html(管理員界面,包含增刪查以及文件上傳操作,上傳過程中修改文件名)

{#    管理員界面      #}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>管理員界面</title>
    <link rel="stylesheet" href="static/css/login_regist.css">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>

    <h3 class="page-title" align="center">增加零食信息</h3>
    <form action="/add" enctype='multipart/form-data' method='POST'>
        <div class="form-container">
            <div class="form-group">
                <input type="file" name="file" style="margin-top:20px;"/>
                <br>
            </div>
            <div class="form-group">
                <input type="text" class="form-control" placeholder="零食名" name="name">
            </div>
            <div class="form-group">
                <input type="text" class="form-control" placeholder="價格" name="price">
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block">增加</button>
            </div>
        </div>
    </form>




</br>

    <p align="center">所有商品信息</p>
    <table class="table table-bordered" border="2" align="center">
    <tr>
        <th>零食圖片</th>
        <th>零食名稱</th>
        <th>零食價格</th>
        <th>刪除該商品</th>
    </tr>
        {% for i in u %}
            <tr>
                <td>
                    <img src="static/images/{{ i[0] }}.jpg" width="30px" height="30px">
                </td>
                <td>{{ i[0] }}</td>
                <td>{{ i[1] }}</td>
                <td>
                    <a href="/delete/?name={{i[0]}}">
                        刪除該商品
                    </a>
                </td>
            </tr>
    {% endfor %}
    </table>

</body>
</html>

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}-知了課堂問答平臺</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="{{ url_for('static',filename='css/base.css') }}">
    {% block head %}{% endblock %}
</head>
<body>
    <nav class="navbar navbar-default">
      <div class="container">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>

        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav">
            <li class="active">
                <a href="/">首頁<span class="sr-only">(current)</span></a>
            </li>

          </ul>

          <ul class="nav navbar-nav navbar-right">
{#              {% if user %}#}
{#                  <li><a href="#">{{ user.username }}</a></li>#}
{#                  <li><a href="{{ url_for('logout') }}">註銷</a></li>#}
{#              {% else %}#}
{#                  <li><a href="{{ url_for('login') }}">登錄</a></li>#}
{#                  <li><a href="{{ url_for('regist') }}">註冊</a></li>#}
{#              {% endif %}#}
                  <li><a href="{{ url_for('login') }}">登錄</a></li>

                  <li><a href="{{ url_for('regist') }}">註冊</a></li>
                  <li><a href="{{ url_for('forget') }}">忘記密碼</a></li>
          </ul>
        </div><!-- /.navbar-collapse -->
      </div><!-- /.container-fluid -->
    </nav>
    <div class="main">
        {% block main %}{% endblock %}
    </div>
</body>
</html>

forget.html (發送郵件功能)

{% extends 'base.html' %}

{% block title %}登錄{% endblock %}


{% block head %}
    <link rel="stylesheet" href="{{ url_for('static',filename='css/login_regist.css') }}">
{% endblock %}

{% block main %}
    <h3 class="page-title">找回密碼</h3>
    <form action="/forget1" method="GET">
        <div class="form-container">
            <div class="form-group">
                <input type="text" class="form-control" placeholder="郵箱" name="email">
            </div>
            <div class="form-group">
                <input type="text" class="form-control" placeholder="用戶名" name="name">
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block">提交</button>
            </div>
        </div>
    </form>
{% endblock %}

login.html(登陸界面)

{% extends 'base.html' %}

{% block title %}登錄{% endblock %}


{% block head %}
    <link rel="stylesheet" href="{{ url_for('static',filename='css/login_regist.css') }}">
{% endblock %}

{% block main %}
    <h3 class="page-title">登錄</h3>
    <form action="/login" method="GET">
        <div class="form-container">
            <div class="form-group">
                <input type="text" class="form-control" placeholder="用戶名" name="name">
            </div>
            <div class="form-group">
                <input type="password" class="form-control" placeholder="密碼" name="psd">
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block">登錄</button>
            </div>
        </div>
    </form>
{% endblock %}

部分問題整理

flask使用 secure_filename()獲取中文文件名問題
flask上傳文件代碼參考
flask郵件發送參考
flask原生sql語句操作mysql數據庫參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章