一、学习文档
Flask 依赖 Jinja 模板引擎和 Werkzeug WSGI 套件
W3Cschool:https://www.w3cschool.cn/flask/
Flask中文文档:https://dormousehole.readthedocs.io/en/latest/
Jinja2 模板文档:https://jinja.palletsprojects.com/en/2.11.x/templates/
Werkzeug 文档:https://werkzeug.palletsprojects.com/en/1.0.x/
Flask应用功能扩展:https://dormousehole.readthedocs.io/en/latest/extensions.html#extensions
Flask生产环境部署:https://dormousehole.readthedocs.io/en/latest/deploying/index.html#deployment
二、项目结构
pycharm新建Flask项目之后添加或修改如下项目文件
三、项目文件
404.html
代码语言:python代码运行次数:0复制 <h1>404 error</h1>
<a href = "{{ url_for('index') }}">index</a> <br/>
hello.html
代码语言:javascript复制<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
<a href = "{{ url_for('index') }}">index</a> <br/>
index.html
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome to Flask!</title>
<!-- Flask加载静态资源 -->
<script type = "text/javascript"
src = "{{ url_for('static', filename = 'js/hello.js') }}" ></script>
</head>
<body>
<h1>Welcome to Flask!</h1>
<input type = "button" onclick = "sayHello()" value = "Say Hello" />
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
{% endwith %}
<a href = "{{ url_for('set_cookie') }}">set_cookie</a> <br/>
<a href = "{{ url_for('get_cookie') }}">get_cookie</a> <br/>
<a href = "{{ url_for('del_cookie') }}">del_cookie</a> <br/>
<a href = "{{ url_for('login') }}">login</a> <br/>
<a href = "{{ url_for('upload_file') }}">upload</a> <br/>
<a href = "student.html">student</a> <br/>
<b><a href = 'mysqldb.html'>mysqldb</a></b> <br/>
<b><a href = "{{ url_for('logout') }}">点击这里注销</a></b> <br/>
<a href = "404.html">404</a> <br/>
</body>
</html>
kv-result.html
代码语言:javascript复制 <table border = 1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }} </th>
<td> {{ value }}</td>
</tr>
{% endfor %}
</table>
<a href = "{{ url_for('index') }}">index</a> <br/>
login.html
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form method = "post" action = "http://localhost:5000/login">
<table>
<tr>
<td>Username</td>
<td><input type = 'username' name = 'username'></td>
</tr>
<tr>
<td>Password</td>
<td><input type = 'password' name = 'password'></td>
</tr>
<tr>
<td><input type = "submit" value = "Submit"></td>
</tr>
</table>
</form>
{% if error %}
<p><strong>Error</strong>: {{ error }}</p>
{% endif %}
</body>
</html>
mysqldb.html
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>mysql_db</title>
</head>
<body>
<form action="/mysql_db" method="POST">
<p>ip:<input type="text" name="ip" value="127.0.0.1"/></p>
<p>port:<input type="text" name="port" value="3306"/></p>
<p>username:<input type="text" name="username" value="root"/></p>
<p>password:<input type="text" name="password" value="123456"/></p>
<p><input type="submit" value="submit" /></p>
</form>
<a href = "{{ url_for('index') }}">index</a> <br/>
</body>
</html>
result.html
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>mysql_db</title>
</head>
<body>
<form action="/mysql_db" method="POST">
<p>ip:<input type="text" name="ip" value="127.0.0.1"/></p>
<p>port:<input type="text" name="port" value="3306"/></p>
<p>username:<input type="text" name="username" value="root"/></p>
<p>password:<input type="text" name="password" value="123456"/></p>
<p><input type="submit" value="submit" /></p>
</form>
<a href = "{{ url_for('index') }}">index</a> <br/>
</body>
</html>
student.html
代码语言:javascript复制 <form action="/kv-result" method="POST">
<p>Name <input type = "text" name = "Name" value = "Name" /></p>
<p>Physics <input type = "text" name = "Physics" value = "Physics" /></p>
<p>Chemistry <input type = "text" name = "chemistry" value = "chemistry" /></p>
<p>Maths <input type ="text" name = "Mathematics" value = "Mathematics" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
upload.html
代码语言:javascript复制 <h1>Upload new File</h1>
<form method=post enctype=multipart/form-data>
<input type=file name=file>
<input type=submit value=Upload>
</form>
<a href = "{{ url_for('index') }}">index</a> <br/>
app.py
代码语言:javascript复制import os, json
from flask import Flask, render_template, flash, request, redirect, jsonify, session
from flask import escape, url_for, make_response, abort
from werkzeug.utils import secure_filename
from utils.db.MySQLUtil import MySQLUtil
UPLOAD_FOLDER = './'
ALLOWED_EXTENSIONS = {'txt', 'log', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
@app.route('/index', methods=['GET', 'POST'])
def index():
"""请求方法和cookie"""
method = request.method
username = request.cookies.get('username')
print(method, username)
return render_template('index.html', name="name_welcome")
@app.route('/hello/')
@app.route('/hello/')
def hello(name=None):
"""变量规则"""
return render_template('hello.html', name=name)
def allowed_file(filename):
return '.' in filename and
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
"""文件上传"""
if request.method == 'POST':
# check if the post request has the file part
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
# if user does not select file, browser also
# submit an empty part without filename
if file.filename == '':
flash('No selected file')
return render_template('upload.html')
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
flash('upload file success')
return url_for('upload_file', filename=filename)
return render_template('upload.html')
@app.route('/match/')
def match_url(str):
"""url构建"""
print('{}'s profile'.format(escape(str)))
return render_template(str ".html")
@app.route('/')
def url_forward(str):
"""url构建"""
return render_template(str)
@app.route('/set_cookie')
def set_cookie():
"""存储cookie"""
response = make_response("set cookie success")
response.set_cookie('username', 'the username')
flash(str(response))
return redirect(url_for('index'))
@app.route('/get_cookie')
def get_cookie():
"""读取cookie"""
cookie = request.cookies.get('username')
flash(cookie)
return redirect(url_for('index'))
@app.route("/del_cookie")
def del_cookie():
"""删除cookie(删除只是让cookie过期)"""
response = make_response("delete cookie success")
response.delete_cookie("username")
flash(str(response))
return redirect(url_for('index'))
@app.route('/')
def my_redirect():
return redirect(url_for('login'))
@app.errorhandler(404)
def page_not_found(error):
"""404状态返回网页"""
return render_template('404.html'), 404
@app.route('/login', methods = ['GET', 'POST'])
def login():
"""消息闪现"""
error = None
if request.method == 'POST':
if request.form['username'] != 'admin': ## or request.form['password'] != 'admin':
error = "Invalid username or password. Please try again!"
else:
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html', error=error)
@app.route('/logout')
def logout():
"""删除session中的username"""
session.pop('username', None)
return redirect(url_for('login'))
@app.route('/kv-result', methods=['POST', 'GET'])
def result():
"""将表单数据返回给模板"""
if request.method == 'POST':
result = request.form
print(result)
return render_template("kv-result.html", result=result)
@app.route('/mysql_db', methods=['POST', 'GET'])
def mysql_db():
"""查询MySQL全部数据库名称"""
if request.method == 'POST':
form = request.form
print(type(form), form)
ip = form['ip']
port = form['port']
username = form['username']
password = form['password']
print(ip, port, username, password)
mysqlUtil = MySQLUtil(ip, port, username, password)
dbs = mysqlUtil.list_databases()
print(dbs)
return render_template("result.html", result=dbs)
if __name__ == '__main__':
print(1111)
app.run(host='0.0.0.0', port='5000', debug=True, threaded=True)
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
print(2222)
flash.py
代码语言:javascript复制#-*- encoding: utf-8 -*-
from flask import Flask, flash, redirect, render_template, request, url_for
app = Flask(__name__)
app.secret_key = 'random string'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods = ['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or
request.form['password'] != 'admin':
error = 'Invalid username or password. Please try again!'
else:
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html', error=error)
if __name__ == "__main__":
app.run(debug=True)
四、效果展示
执行 app.py 启动程序,浏览器访问 http://127.0.0.1:5000/login
1、登录页面
输入用户名:admin(密码随意)