flask入門
文章目錄
創建虛擬環境
python3創建方法;
1.pip install python3-env
2.python3 -m venv <虛擬環境文件名> 或者 python -m venv <虛擬環境名字>
3.進入該虛幻環境 並激活 激活指令activate
4.退出虛擬環境 deactivate
python2創建方法:
- pip install virtualenv
- virtualenv <虛擬環境名>
- 進入該虛幻環境 並激活 激活指令activate
- 退出虛擬環境 deactivate
一個基本flask項目目錄結構
flask
├── app 該項目文件
│ ├──__ init__.py 初始化文件
│ ├── routes.py 路由設置
│ └── templates 模板文件
│ ├── base.html
│ └── index.html
├── run.py 啓動文件
|—–congfig.py 配置文件
路由route
# @app.route是一個裝飾器
# 裝飾器作用是 做一個url與試圖函數的映射
# 通過127.0.0.1:5000/hello 可以請求hello()視窗函數
@app.route("/hello/")
def hello(id):
return "請求參數是 " + id
設置debug模式
作用:項目運行中如果修改了某些代碼,會自動重新加載項目
f __name__ == "__main__":
#這個項目運行,是一個監聽的狀態,一直運行
#while(True):
# listen();
#app.run(host,port,debug,options);都是可變參數
app.run()
url傳參數
作用:1.可以相同的url下獲得不同的數據
2.在flask如何使用參數
@app.route("/hello/<id>")
def hello(id):
return "請求參數是 " + id
#反轉url 通過視窗函數獲得url
#使用url_for("視窗函數"),url("視窗函數",“參數”)來獲得url
@app.route("/")
def index():
print(url_for("my_list"))
print (url_for("hello",id=3))
return "hello world "
###當視窗函數有參數時,要傳參數。
###好處:頁面重定向,頁面跳轉的時候
#簡單實現重定向
##重定向方法:redirect
@app.route("/login")
def login():
return "這是登陸界面"
@app.route("/logined")
def logined():
return "這是登陸後的界面"
@app.route("/index/<is_login>")
def index(is_login):
if is_login=="1":
logined_url=url_for("logined")
return redirect(logined_url)
else:
login_url=url_for("login")
return redirect(login_url)
#說明:本來是index界面,通過簡單的判斷,來重定向返回不同的界面。
##### 如果參數是1,那麼判斷返回登陸後的界面,否則返回登陸界面
模板templates
Flask渲染jinja2模板和傳參
- 模板放在templates文件下
- 從flask中導入render_template方法渲染模板
- 注意:在視圖函數中返回render_template(“模板名”),不需要填寫templates路徑
#1.模板傳參
##index.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>first</title>
</head>
<body>
<!-- {{username}}是一個flask語法>
<p> 你好:{{username}}</p>
</body>
</html>
##2.模板渲染。返回index.html模板,同時返回了一個參數username
@app.route("/")
def index():
return render_template("index.html",username="zhangchuan")
#3.返回多個參數
##使用可變參數,一次返回多個參數
@app.route("/")
def index():
context={"name":"張川",
"gender":"男",
"is_handsome":"yes"}
return render_template("index.html",username="zhangchuan",**context)
#4.訪問模型中字典或者對象的屬性
##使用{{params.property}}形式,也可以是{{params["property"]}},
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>first</title>
</head>
<!--用python獲取字典某鍵的value方法>
<p> 百度:{{websites["baidu"]}}</p>
<p>google:{{websites["google"]}}</p>
<!--第二種 websites.baidu 方法>
<p> 百度:{{websites.baidu}}</p>
<p>google:{{websites.google}}</p>
<body>
@app.route("/")
def index():
context={"name":"張川",
"gender":"男",
"is_handsome":"yes",
"websites":{"baidu":"www.baidu.com",
"google":"www.google.com"}}
return render_template("index.html",**context)
在模板中使用python語句
語法:{% python語句 %}
{%end for%}
#注意結束語句 {%end for%}
過濾器
作用:處理變量
語法:
{{params|default(new params)}}
default過濾器:如果avater參數不存在,就返回|後的參數
還有其他過濾器查找官網。
模板繼承和使用block
#繼承base.html界面
{%extends base.html%}
{%block%}
//內容
{%endblock%}
這是base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
<style>
.index{
background: #3a3a3a;
height:65px;
}
ul li{
float:left;
list-style:none;
padding:0 10px;
line-height: 65px;
}
ul li a{
color: #ffffff;
}
</style>
</head>
<body>
<div class="index">
<ul>
<li><a href="url_for("index")">首頁</a></li>
<li><a href=url_for("login")>登錄</a></li>
<li><a href="urll_for("register") >註冊</a></li>
</ul>
</div>
{%block main%}{%endblock%}
</body>
</html>
繼承的界面
<!--這是首頁繼承base.html頁面--!>
{% extends 'base.html'%}
{%block main%}
<h1>這是首頁</h1>
{%endblock%}
<!--這是登錄界面繼承base.html頁面--!>
{% extends "base.html"%}
{%block main%}
<h1>這是登錄界面</h1>
{%endblock%}
加載靜態文件
j加載圖片,加載css,視屏,js都是如此
語法:{{url_for(‘static’,filename=‘css/index.css’)}}
{{url_for(‘static’,filename=‘images/follow.ico’)}}
數據庫配置
在_init_.py中使用添加如下
from flask-sqlalchemy import SQLAlchemy
app=Flask(__name__)
#建立數據庫關係
db=SQLAlchemy(app)
在config.py中添加
#數據庫格式 dialect+driver://username:password@host:port/database
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/flask-blog'
SQLALCHEMY_TRACK_MODIFICATIONS =False
在models.py中創建數據庫模型
使用SQlAlchemy實現app應用與數據庫的綁定
ORM對象關係映射
面向對象概念 | 面向關係概念 |
---|---|
類 | 表 |
對象 | 一條記錄 |
屬性 | 字段 |
#創建數據庫模型
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
db.create_all()
使用Migrate庫實現數據庫模型映射到數據庫中
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from app import app,db
from app.models import User,Blog
"""
flaskweb應用實例app與數據庫綁定,使用Migrate庫 方便操作web應用與數據庫
數據庫模型遷移: 模型--->遷移文件-->數據庫中表創建
"""
manager=Manager(app)
#綁定app和數據庫,以便進行操作web應用app與數據庫
migrate = Migrate(app,db)
#把MigrateCommand命添加到manager中
manager.add_command('db',MigrateCommand)
if __name__=="__main__":
manager.run()
之後使用cmd進入該項目虛擬環境輸入命令:
- python manage.py db init 首先使用init命令初始化環境
- python manage.py db migrate 生成遷移文件migrations
- python mannage.py db <migrations中的一些指令>
curd操作增刪改查
user1=User(username="zhangsan",email="[email protected]")
#添加到會話
db.session.add(user1)
#提交,纔會增加到數據庫中
db.session.commit()
flask中的seesion機制
把敏感數據經過加密放入‘session’中,再放入瀏覽器中的cookie中,下次請求的時候,讀取瀏覽器發送的cookie中讀取session,最後讀取session解密獲取數據。。
flask把所有敏感數據都放入了瀏覽器中。
操作session
操作session就與操作字典一樣
1.添加session
session[‘username’]=‘zhangsan’
2.刪除
session.pop(‘username’)
3.刪除所有session
session.clear()
4.獲取session
session.get(‘username’)
實例:
#使用session需要設置一個SERCRET_KEY,作爲加密使用的
import os
app.config['SECRET_KEY']=os.urandom(24)
@app.route('/')
def index():
session['username']='zhangsan'
return 'hello world'
這樣就給 ‘username’:‘zhangsan’這條信息加密了
並且flask自動將其放在session中並放入了瀏覽器的cookie中
注意:由於是隨機給的24位的SERCRET_KEY 所以每次重新運行服務器的時候,每次加密的就不一樣,就會導致不能正確解析 加密信息。所以可以寫死SERCRET_KEY,這樣每次重新運行服務器也可以解析加密信息。
瀏覽器中查看cookie 。
flask請求對象request
一些屬性和方法
flask響應對象response
post和get請求獲取參數
1.get請求是通過“flask.request.args”獲取
2.post請求時通過“flask.request.form”獲取表單數據
3.post請求獲取表單數據注意事項
*input標籤中需要使用name標識這個value的key,方便後臺獲取數據
*form表單需要指明method=‘POST’,action="/login/"或者“{{url_for(‘login’)}}”來指明哪個鏈接,也就是哪個視窗函數來接收這個表單數據
示例代碼
form aciton="{{url_for('register')}}" method="POST">
<div class="form-container">
<div class="form-group">
<input type="text" class="form-control" name='telephone'placeholder="手機號碼">
</div>
<div class="form-group">
<input type="password" class="form-control" name='password' placeholder="密碼">
</div>
<div class="form-group">
<button class="btn btn-primary btn-block">註冊</button>
</div>
</div>
</form>
後臺代碼:
@app.route("/register/",methods=["GET","POST"])
def register():
if request.method=="GET":
return render_template("register.html")
else:
#獲取表單數據
telephone = request.form.get("telephone")
password=request.form.get('password')
個人博客項目效果圖。需要de,移步我的資源: https://download.csdn.net/download/weixin_43919632/11424229