flask簡介
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。優點是耦合度大幅度降低,提升了可擴展空間,缺點是複雜了維護性。
創建flask
使用pycharm工具,首先需要在虛擬環境其中安裝flask,然後直接創建即可,因爲pycharm支持創建flask框架。
分析自動生成的文件
static:主要存放靜態頁面、js、css、圖片之類的文件,可以通過兩種方式去調用,有和
templates:主要存放前後端分離的頁面,有後端的存在,調用時需要.do方法。
app.py:初始生成的,也是執行文件,內部代碼中,先引入flask庫的一些模塊,然後定義app變量,寫url路由,定義函數,調用變量的run方法執行。
手動添加的配置文件
有三種方式(任選其中一個):
1.腳本中直接寫入(app.py中)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'AADASDHASBKJASHAKJ' #設置項目全局安全密鑰
2.單獨的配置文件(新建的配置文件config.py)
'''
自定義配置文件(正式發佈時的配置文件)
'''
DEBUG = True
SECRET_KEY = 'ASDQWEZXCEFGDFGFSDA'
PAGE_SIZE = 10 #每頁顯示10條
SERVER_ADDR = '10.0.14.45' #地址號,用自己的,默認爲127.0.0.1
SERVER_PORT = '8080' #端口號,用自己的,默認爲5000
3.定義不同的配置類,想用哪個調用哪個(新建的配置類文件config_class.py)
#都是key—value結構
class DebugConfig():
DEBUG = True
SECRET_KEY = 'ASDQWEZXCEFGDFGFSDA'
PAGE_SIZE = 10 # 每頁顯示10條
pass
class DevelomentConfig():
DEBUG = True
SECRET_KEY = 'ASDQWEZXCEFGDFGFSDA'
PAGE_SIZE = 10 # 每頁顯示10條
pass
class TestConfig():
DEBUG = True
SECRET_KEY = 'ASDQWEZXCEFGDFGFSDA'
PAGE_SIZE = 10 # 每頁顯示10條
pass
添加項目(html、css、img、js等)
因爲學習flask之前必須會前端技術,所以應該已經有前端項目了,直接將已經建立好的html文件放入指定位置(上面有)即可。然後根據需求合理調用(python和html有不同,尤其是引入文件方面)
代碼示例(內附說明)
其中,/代表根地址,/biaoform.do代表執行到前面的地址,每有一個前後端分離的頁面就要有一個路由,同時有一個.do
app.py文件
from flask import Flask,render_template,request,session
import config #引入配置文件
from config_class import * #引入類的配置文件
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'AADASDHASBKJASHAKJ' #設置項目全局安全密鑰
#使用config.py文件
app.config.from_object(config)#用文件配置文件
#使用config_class.py文件
app.config.from_object(DebugConfig)#用類的配置文件
#config是字典類型
@app.route('/') #url路由
def index():
return render_template('index.html')
@app.route('/login.do',methods=['POST','GET']) #登陸界面的路由
def login():
#傳統方法獲取名字和密碼
username = request.form.get('username') #表單提交的數據,用request.form.get來取,如果是鏈接,用args.get
userpwd = request.form.get('userpwd')
#校驗
if username == 'zhangsan' and userpwd == '123456':
session['username'] = 'zhangsan'
return render_template('index.html')#成功進入主頁
pass
elif username != None and (username != 'zhangsan' or userpwd != '123456'):
return render_template('login.html',message='用戶名或密碼錯誤')
return render_template('login.html')#否則返回登錄頁
@app.route('/biao.do',methods=['POST','GET']) #登陸界面的路由
def biao():
return render_template('biao.html')
pass
@app.route('/biaoform.do',methods=['POST','GET']) #登陸界面的路由
def biaoform():
return render_template('index.html')
pass
if __name__ == '__main__':
app.run( host='10.0.14.45', port=8080, debug=True) #先將flask_debug打開,然後用腳本,python app.py
#等同於 host=app.config['SERVER_ADDR'],port=app.config['SERVER_PORT']
(登陸界面)login.html
其中{{}}是python的寫法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陸界面</title>
</head>
<body>
<form action="/login.do" method="post">
<table>
<span color="red">{{ message }}</span>
<tr>
<td>用戶名:</td><td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密碼:</td><td><input type="password" name="userpwd" /></td>
</tr>
<tr>
<td></td>
<td>
<input type="reset" value="重置" />
<input type="submit" value="提交" />
</td>
</tr>
</table>
</form>
</body>
</html>
(主界面)index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>徵婚啓事</title>
<link rel="stylesheet" href="{{ url_for('static',filename ='css/2.css',_external = True) }}" />
<!--<link rel="stylesheet" href="static/css/2.css" />-->
</head>
<body>
<div id="header">
<div>
<a href="/login.do">
{% if session.get('username')==None %}
登陸
{% else %}
{{ session.get('username') }}
{% endif %}
</a>
</div>
<div class="continer">
姓名
<div id="name">臨潼</div>
</div>
<div class="continer">
年齡
<div id="age">21</div>
</div>
<div class="continer">
住址
<div id="address">湯臣一品</div>
</div>
<div class="continer">
身價
<div id="money">數以億計</div>
</div>
<div class="continer">
背景
<div id="bat">某知名大佬</div>
</div>
<div class="continer">
戀愛經驗
<div id="love">無</div>
</div>
</div>
<div id="main">
<div id="left">
<img src="{{ url_for("static",filename="img/timg.jpg") }}"/>
</div>
<div id="middle">
<iframe width="100%"height="800px" name="innerframe" id="ie">
</iframe>
</div>
<div id="right">
<div id="rightdata">
<a href="/biao.do" target="innerframe">同意點此</a>
</div>
</div>
</div>
<div id="footer">
<b>@author:lint
@time:2019.9.20
@tel:123456789
</b>
</div>
</body>
</html>
<script type="text/javascript">
bgarray = ['static/img/1.jpg','static/img/2.jpg','static/img/3.jpg']
i = 0
function changeBackGround(){
if (i<bgarray.length){
document.getElementById('ie').style.backgroundImage = 'url('+bgarray[i]+')'
i++
}else{
i = 0
document.getElementById('ie').style.backgroundImage = "url('static/img/timg (2).jpg')"
}
}
if(i==0){
document.getElementById('ie').style.backgroundImage = "url('static/img/timg (2).jpg')"
}
setInterval(changeBackGround,2000)//兩秒(2000毫秒)換圖片 setInterval無限循環
</script>
(另一個界面iframe調用的)biao.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="static/css/biao.css" />
<script type="text/javascript">
function houhui(){
alert("生不生隨你");
alert("保大");
alert("跟誰姓都行");
alert("男女都一樣");
alert("我媽會游泳");
alert("房證你名");
alert("工資卡給你");
alert("重新考慮一下好嗎(*^_^*)")
}
</script>
</head>
<body>
<form method="post" action="/biaoform.do">
<fieldset id="">
<div id="left">
<h1>婚書</h1> 姓 名:
<input type="text" /><br /> 個人圖像:
<input type="file" name="picture" /><br /> 年 齡:
<input type="text" name="age" /><br /> 宣誓內容:
<textarea rows="10" cols="50">宣誓:</textarea><br /> 愛 好:
<input type="checkbox" name="hoby" />做飯
<input type="checkbox" name="hoby" />洗碗
<input type="checkbox" name="hoby" />做家務
<input type="checkbox" name="hoby" />帶孩子
<input type="checkbox" name="hoby" />掙錢
<input type="checkbox" name="hoby" />洗衣服<br />
<!--選項卡 selected="selected"默認選中-->
住 房:
<select name="city">
<option value="1" selected="selected">上海</option>
<option value="2">北京</option>
<option value="3">廊坊</option>
</select><br />
<input type="submit" value="確定" id="button" onclick="javascript:alert('恭喜你,做了最正確的決定!')"/>
<input type="button" id="houhuia" value="放棄" onclick="houhui()"/>
</div>
<div id="footer">
<img src="{{ url_for("static",filename="img/timg (1).jpg") }}" />
</div>
</fieldset>
</form>
</body>
</html>
存在小bug,iframe比較噁心,如果不用的話,可以很完美的實現,只是因爲太過簡單,不想改,如果有更完美的頁面的話,就沒事了,主要提供一個方法