flask入門

flask入門

創建虛擬環境

python3創建方法;

1.pip install python3-env

2.python3 -m venv <虛擬環境文件名> 或者 python -m venv <虛擬環境名字>

3.進入該虛幻環境 並激活 激活指令activate

4.退出虛擬環境 deactivate

python2創建方法:

  1. pip install virtualenv
  2. virtualenv <虛擬環境名>
  3. 進入該虛幻環境 並激活 激活指令activate
  4. 退出虛擬環境 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庫實現數據庫模型映射到數據庫中

創建manage.py

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進入該項目虛擬環境輸入命令:

  1. python manage.py db init 首先使用init命令初始化環境
  2. python manage.py db migrate 生成遷移文件migrations
  3. 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
在這裏插入圖片描述

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