整个hello.py程序脚本就是把前面介绍的三部分合并到个文件中。 程序代码如下示例2-1 hllopy:
一个完整的Flask程序
from flask import Flask
from flask_script import Manager
from Demoapp.views import bluedemo
app = Flask(__name__)
manager = Manager(app=app)
app.register_blueprint(bluedemo)
if __name__ == '_main__':
manager.run()
debug是否开启调试模式,开启后修改python的代码会自动重启port启动指定服务器的端口号host主机,默认是127.0.0.1
Tr:要想运行这个程序,请确保激活了你之前创建的虚拟环境,并在其中安装了Flsk现在打开Web别览器,在地址栏中输入h/1/ 00.0000图2-1是浏览精连接到程序后的示意图。
**代码结构**
static静态资源文件
templates模板文件
默认两个都可以直接使用
直接使用相对路径就好模板渲染
render template O
其实也是分为两个过程,加载和道染
静态使用,相当于反向解析
url_ for( 'static filename= mysc.cBs
pintirequesthesi
pinmiequest coo
。pinvequest rensole ada)
#刘览器身份
ptintpequestuse. 3ogen
Tetum需求
类字典的数费构
与字典的区别,可以存在相同的
angsltom都基|mm tetu服橡
mmubeMutiea中数据获取方式
actpunamejiaict gm’unamen
获key对应的所有值
dctgetuvamne
Response
服务器返回会始客户端的数器
由程序员创建,ABRasporo时家
1.真接返同Response对像
2.通过maks, response (aia.codey
code状杰网
3返区文本内容,状志码
4.避回楼板(本质和一样
重定向
readieal)
utor教名数albei
route规则
写法;
converter类型
string
接收任何没有斜杠()的文件(默认)
int接收整型
float
接收浮点型
path
接收路径,可接收斜线(")
uuid
只接受uuid字符串,唯码,-种生成规则
any
可以同时指定多种路径,进行限定I
和枚举,集合的意思差不s
@app.route(any/
def any (any)
print(an)
@app.route(lrequest', Gethods="GET])
def request1():
print(request)
print(type(request))
print(request.method)
print(request.data)
# arguments歌数tget请求参数,
print(request.args)
# post相关请求都会有数据
print(request.form)
ImmutableMultiDict
类似字典的数据结构
与字典的区别,可以存在相同的键
args和form都是ImmutableMultiDict的对象
ImmutableMultiDict中数据获取方式
dict"uname’]或dict.get(‘uname’)
获取指定key对应的所有值
dict.getlistuname’)
Response
服务器返回会给客户端的数据
由程序员创建,返回Response对象
1.直接返回Response对象
2.通过make_ response (data,code)
-data返回的数据内容
demo1
@app.route("/response)
def resp():
result= render_ template('demo03.htm')
print(result)
print(type(result))
returm'人工智能,403
demo2
response = make_ response(' 实践操作
', 404)
response = Response("啦啦啦德玛西亚,status=606) #跟上面-样
print(response)
print(type(response))
return response
@app.route('request", methods=['GET')
def request1():
print(request)
print(type(request)
print(request.method)
print(request.data)
# arguments歌数↑get请求参数,
print(request.args)
# post相关请求都会有数据
print(request.form)
print(request.files)
print(request.cookies)
# print(request.remote_ addr)
#浏览器身份
print(request.user_ agent)
return请求
methods='GET, 'POST; 'DELETE]
@app.routet(/rule" .methods='GET,POST])
def hello():
print(request)#注意导包
pinttype(request))
returm "hellow
methods中指定请求方法
GET
POST
HEAD
PUT
DELETE
url_ for
I反向解析,根据函数名字,获取反向路径
ur_ for(”函数名,,参数名=value)
代码demo1
@app.route('demo1/, methods=[' GET, 'POST])
def index3(name):
re = ur_ for('get_ uuid') #反向解析路径
return redirect(re) #重定向跳转
兼容性可能跟虚拟环境-样
安装pip install virtualenv
直看是什么版本: virtualenv -version
激活命令venvScriptsactivate
Imac或者 linux $ source venv/bin/activate
当虚拟环境中的工作完成后,如果你想回到全局Python解释器中,可以在命令行提示符下
输入deactivate
2、终止执行
主动终止abort(code)
捕获异常(后面再讲解)
https://www.cnblogs.com/huchong/archive/2018/06/20/9205651.html
@app errorhandler(404)
I
def hello(e):
retur LOL'
demo1-abort
*在flask中可以通过abort中断触发请求对应的状态码
from flask import abort
Bapp.route('/*) :
def index():
abort(401) * 请求到此即中断,不会打印下面的语句,井返回TTP状态码401
print "123
Json
@app.route(json")
def json 666():
js = json.jsonify({
name': 'value')
#S = json.jsonify(name='value', age='3)
#s = json.dumps({ name': ' value', ' age': 18))
printjs)
print(type(js))
return js
Flask扩展(今天重点)
命令行参数
安装插件lask script
命令pip install flask _script
调整代码
manager = Manager(app)
启动的地方
manager.un()
参数使用
-d
是否开启调试模式
是否自动重新加载文件
-h, --host指定主机
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>欢迎回来:{
{
username}}</h2>
<br>
<a href="{
{url_for('second_blue.login') }}" >登入</a>
<a href="{
{ url_for('second_blue.logout') }}">退出</a>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="{
{ url_for('second_blue.login') }}" method="POST">
<span><input type="text" name="username" placeholder="请输入用户名"/></span>
<br>
<input type="submit" value="登入">
</form>
</body>
</html>
manager
from flask import Flask
from flask_script import Manager
from App.views import blue
from App.view2 import blue as blue2 #可以blue2自己定义,下面同步
app = Flask(__name__)
app.register_blueprint(blueprint=blue)
app.register_blueprint(blueprint=blue2)
manager = Manager(app=app)
if __name__ == '__main__':
manager.run()
第一个视图
from flask import Blueprint, render_template, json
blue = Blueprint('first_blue', __name__)
@blue.route('/day9/')
@blue.route('/')
def hello_world():
name = 'zhangsan' # 字符
dict1 = {
'a': 1, 'b': 2, 'c': '3'} # 字典
strs1 = ['AI人工智能-训练机器学习', '智慧校园', '泉舟时代', '智慧水利', '智慧园区', '智慧防汛', '智慧机场', '智慧环保']
return render_template('index.html', dict=dict1, name=name, strs=strs1)
# @blue.route('/url_for/')
# def url_for():
# result=url_for('first_blue.index')
# return result
第二个视图
from flask import Blueprint, url_for, render_template, request, redirect, Response
blue = Blueprint('second_blue', __name__)
@blue.route('/')
def index():
return 'hello Flask'
@blue.route('/url_for/')
def url():
result = url_for('second_blue.index')
# return redirect(result)
return str(result)
@blue.route('/home/')
def home():
username = request.cookies.get('user')
print(username)
return render_template('home.html', username=username)
@blue.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == "GET":
return render_template('Login.html')
elif request.method == "POST":
username = request.form.get('username')
print(username)
response = Response('恭喜你登入成功:%s' % username)
response.set_cookie('user', username)
print(request.cookies.get('user'))
# return redirect(url_for('second_blue.home')) # response
# return response
username = request.cookies.get('user')
print(username)
return render_template('home.html', username=username)
@blue.route('/logout/')
def logout():
rsp = redirect(url_for('second_blue.home'))
rsp.delete_cookie('user')
return rsp
base10.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>base10</title>
{
% block extCSS %}
{
% endblock %}
</head>
<body>
<p>#ctrl+alt+space
#tab
<h1>模板底层</h1>
{
% block extheader %}
{
% endblock %}
{
% block extcontent %}
{
% endblock %}
{
% block extfoot %}
{
% endblock %}
{
% block extJS %}
{
% endblock %}
</body>
</html>
inde10.html 第一次 extend 调用 封装好的模板
{
% extends 'base10.html' %}
{
##}
{
% block extCSS %}
<link rel="stylesheet" href="{
{ url_for('static',filename='css/index10.css') }}">
{
% endblock %}
{
% block extheader %}
<h1>这是头部</h1>
{
% endblock %}
‘第二次调用 mine.html
{
% extends 'index10.html' %}
{
% block extCSS %}
{
{
super() }}
{
# {
{ block.super() }} django 的语法#}
<link rel="stylesheet" href="{
{ url_for('static',filename= 'css/mine10.css') }}">
{
% endblock %}
{
% block extheader %}
{
{
super() }}
<h3>mine人工智能挖坑第二次</h3>
{
% endblock %}
{
% block extcontent %}
{
% include 'content10.html' %}
{
% macro hello(name,age) %}
<h2>{
{
age }}岁的你{
{
name }} :欢迎来到大数据时代下的 宏定义 </h2>
{
% endmacro %}
{
{
hello('ldy',118) }}
{
% from 'mac10.html' import what %}
{
{
what('linde') }}
<ul>
{
% for hobby in hobbies %}
{
% if loop.first %}
<li style="color: red">{
{
hobby }} {
{
loop.revindex }}</li>
{
% elif loop.last %}
<li style="color:green;">{
{
hobby|upper }}</li>
{
% else %}
<li style="color: blue">{
{
hobby }} {
{
loop.revindex }}</li>
{
% endif %}
{
% endfor %}
</ul>
{
% endblock %}
{
% block extfoot %}
<br>
<div>
<h4>这是底部</h4>
</div>
{
% endblock %}
单独写了一个 内容 content10.html
<div>
<link rel="stylesheet" href="{
{ url_for('static',filename='css/content.css') }}">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
{
% macro hello() %}
<h4>python 的宏定义</h4>
{
% endmacro %}
{
{
hello() }}
{
{
hello() }}
{
{
hello() }}
{
% macro sayhello(name,age) %}
<h5>欢迎{
{
age }}岁的{
{
name }}来到大数据物联网时代!</h5>
{
% endmacro %}
{
{
sayhello('ldy',19) }}
{
% from 'mac.html' import what %}
{
{
what(22) }}
</div>
##总结
flask能在客户端与服务器较好的桥接,能够在服务器上形成访问链接,创建web页面,呈现在客户端上。
Flask入门及如何反向解析url
产品经理/产品运营精华干货-泉舟时代智库分享
[PRD制作全过程示例-Axure制作PRD]
技术支持:
泉舟时代集团