################### 1 MVC mode ###############
MVC 流程:
用Hello.py函數最流程的控制-就是MVC中的contoller內容
Hello.py函數指定了一個路由函數app.route('/books/')
同時調用了 models中的book.py函數中的Book方法這是所謂的Model方法M
在執行好函數後,在前臺頁面的book-list.html展示這是所謂的V
代碼及目錄結構:
Hello.py:
from flask import Flask,render_template
from models.book import Book
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/books/')
def book_list():
books = [
Book('python flask',59.00),
Book('Java flask',59.00),
Book('Linux flask',59.00),
Book('windows flask',59.00)
]
return render_template('book-list.html',books=books)
if __name__ == '__main__':
app.run(debug=True)
# app自帶有個debug調式 修改完畢後 不用重啓服務器得到
Book.py:
class Book:
def __init__(self, title,price):
self.title = title
self.price = price
def __str__(self):
return 'Book {}'.format(self.title)
Book-list.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>圖示列表</title>
<link rel="stylesheet" type="text/css" href="../static/css/style.css"/>
</head>
<body>
<h1>圖書列表</h1>
<table border="1px" cellspacing="" cellpadding="3px">
<tr>
<td>書名</td>
<td>定價</td>
</tr>
{% for book in books %}
<tr>
<td>{{book.title}}</td>
<td>{{book.price}}</td>
</tr>
{% endfor %}
..爲了節省空間省略掉不必要部分
學習的點:
在html中讀取路由函數中過來的數據,當不知道多少數據量的情況下 可以用下面的方法:
{% for book in books %}
<tr>
<td>{{book.title}}</td>
<td>{{book.price}}</td>
</tr>
{% endfor %}
在路由函數中,調用模板並傳遞函數:
@app.route('/books/')
def book_list():
books = [
Book('python flask',59.00),
Book('Java flask',59.00),
]
return render_template('book-list.html',books=books)
###########2 設置debug 模式的方法 #########
Hello.py:
app = Flask(__name__)
app.config.from_object(config)
config.py:
DEBUG = True
########3 參數的基本寫法 #######
@app.route('/article/<id>')
# id是一個參數<>就是這個寫法
def article(id):
return f'您請求的id是:{id}'
http://127.0.0.1:5000/article/dd 您請求的id是:dd
######### 4 URL 傳參數 #####
@app.route('/article/<id>')
# id是一個參數<>就是這個寫法
def article(id):
return f'您請求的id是:{id}'
######### 5 url 反轉 url_for ######
@app.route('/')
def index():
print(url_for("article",id='122345'))
print(url_for("book_list"))
# return render_template('index.html')
return "hello world"
@app.route('/article/<id>/')
# id是一個參數<>就是這個寫法
def article(id):
return f'您請求的id是:{id}'
@app.route('/books/')
def book_list():
url_for(),裏面顯示的是def的函數名稱,找到對應的路由
######## 6 url 重定向 redirect ####
@app.route('/')
def index():
login_url = url_for('login')
return redirect(login_url)
return "hello world"
@app.route("/login/")
def login():
return f"這是登錄頁面"
@app.route("/question/<is_login>/")
def question(is_login):
if is_login == "1":
return '這是question頁面'
else:
return redirect(url_for("login"))
通過判斷is_login來解決是否登錄 同時是否需要重定向問題
######## 7 Template 渲染和參數 ######
@app.route('/')
def index():
class Person(object):
name = f'李四'
age = 36
p = Person()
context = {
'username':'zhangsan',
'age':18,
'gender':"男",
* 'personname':p,*
'websites':{
'baidu':'www.baidu.com',
'sina':'www.sina.com'
}
}
return render_template('index.html',other='argsper',**context)
# 他主動回去template尋找
<body>
<h1>優品課堂</h1>
<p>
<p>args: {{other}}</p>
<p>用戶名: {{username}}</p>
<p>年齡: {{age}}</p>
<p>性別: {{gender}}</p>
</p>
<p>
<hr>
<p>另外的人員信息:</p>
<p>姓名:{{personname.name}}</p>
<p>姓名:{{personname['name']}}</p>
<p>年齡:{{personname.age}}</p>
</p>
<hr>
<p>百度:{{websites.baidu}}</p>
<p>百度:{{websites['baidu']}}</p>
<p>新浪:{{websites.sina}}</p>
<p>新浪:{{websites['sina']}}</p>
</body>
######### 8 Flask if else #####
@app.route('/<is_login>/')
def index(is_login):
if is_login == '1':
user = {
'username':f"黃羣",
'age':50
}
return render_template('index.html',users=user)
else:
return render_template('index.html')
html
<body>
<h1>優品課堂</h1>
{% if users and users.age > 18 %}
<a href="#">{{ users.username }}</a>
<a href="#">註銷</a>
{% else %}
<a href="#">登錄</a>
<a href="#">註冊</a>
{% endif %}
</body>