重定向:
- 301永久性重定向:新网址完全继承旧网址,旧网址的排名等完全清零,如京东的域名,原来的域名不用了,基本就是永久性重定向到新域名。
- 302临时性重定向:对旧网址没有影响,但新网址不会有排名,比如看一个东西,会转到登录页面。
from flask import Flask,request,url_for,redirect
import config
#重定向代码如下,profile1目录下重定向到login目录下,如果没有传递参数name
@app.route('/login')
def login():
return 'login page'
@app.route('/profile1')
def profile1():
name=request.args.get('name')
url = url_for("login", user="admin")#动态规划url
#url此时应该是/login?user=admin
if not name:
#如果没有name,说明没有登录,重定向到登录页面
return redirect(url)#重定向,给的是url
else:
return name
传递参数:
定义参数
- 定义参数的方式更利于SEO优化,能够更好的被搜索引擎收录与检索(比如容易被百度蜘蛛爬取),程序健壮性也更高,具体实例如下,就是用的定义参数方式:
- www.123.com/list/local/123/12
@app.route('/blog/list/<any(python1,flask2,django3):category>')#指定范围内字符串
def bolg_list_with_category(category):
return "您获取的博客分类为:%s"%category
@app.route('/book/list')
def book_list():
return "我是博客"
@app.route('/blog/list/<int:user_id>')#用来定义默认值
@app.route('/blog/list/<int:user_id>/<int:page>')#指定范围内字符串
def blog_list1(user_id,page=1):#默认为第一页
return "您查找的用户为:%s,博客分页为:%s"%(user_id,page)
查询字符串
- 查询字符串的方式更灵活一些,具体如下:
- www.123.com/list?local=local&user_id=123&pwd_id=12
@app.route('/blog/list')# 定义参数类型
def bolg_list_detail():
user_id=request.args.get("user_id",default=1,type=int)
page=request.args.get("page",default=1)
return f"您查找的用户为:{user_id},博客分页为:{page}"
请求方式
- flask默认是get,可以设置成post,put,delete等其他方式,具体设置方式如下
@app.route("/blog/add",methods=['POST'])# 定义参数类型
def bolg_add():
return "使用POST方法添加博客"
@app.route("/blog/add/post/get",methods=['POST','GET'])# 定义参数类型
def bolg_add_post_get():
if request.method=='GET':
return "使用GET方法添加博客"
else:
return "使用POST方法添加博客"
jinja模块
变量使用
- person.name与person[“name”]两种方式都能取到值,不过两种取值方式的顺序不一样,一个是先访问 键 再访问对象属性,如果都没有就返回空,另一个访问方式与之相反
from flask import Flask,request,url_for,redirect,render_template
import config
#app = Flask(__name__,template_folder=r"E:\flask\demo4")#自定义templates路径
app = Flask(__name__)
app.config.from_object(config)
class User:
def __init__(self,username,email):
self.username=username
self.email=email
print(app.config["TOKEN_KEY"])
@app.route('/')
def index():
return render_template("index.html")
@app.route('/variable')
def variable():
person={
"name":"张三",
"age":18
}
user=User("李四","xx@qq.com")
hobby="游戏"
contex={
"hobby1":hobby,
"person":person,
"user":user
}
#return render_template("variable.html",hobby1=hobby,person=person,user=user)
return render_template("variable.html",**contex)#变量比较多时可以使用这个方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>变量使用</title>
</head>
<body>
<h1>我的兴趣爱好是:{{ hobby1 }}</h1>
<h1>person的姓名是:{{ person.name }},年龄是{{ person["age"] }}</h1>
<p>user的姓名是:{{ user["username"] }},user的邮箱是{{ user.email }}</p>
</body>
</html>
过滤器
#两种定义过滤器方式
# #自定义过滤器格式,时间格式化
# def datetime_format(value,format="%Y年%m%d %H:%M"):
# return value.strftime(format)
# app.add_template_filter(datetime_format,"dformat")#注册过滤器,第一个参数是函数,第二个参数是过滤器名称
locale.setlocale(locale.LC_CTYPE, 'Chinese')#设置为中文
@app.template_filter("dformat")
def datetime_format(value,format="%Y年%m月%d日 %H:%M"):
return value.strftime(format)
@app.route("/filter")
def filter_demo():
user = User("李四sads", "xx@qq.com")
mytime=datetime.now()
return render_template("filter.html",user=user,mytime=mytime)
html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器使用</title>
</head>
<body>
<div>{{ user.username }}/{{ user.username|length }}</div>
<div>{{ mytime|dformat }}</div>
{#
user|length 获取长度
#}
</body>
</html>
出现报格式错误问题:
UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: Illegal byte sequence
在python代码中加入即可:
locale.setlocale(locale.LC_CTYPE, 'Chinese')#设置为中文
控制语句
python代码
@app.route("/control")
def control_statement():
books=[{
"name":"三国演员",
"author":"罗贯中",
"age":100
},{
"name":"水浒传",
"author":"施耐庵",
"age":19
},{
"name":"红楼梦",
"author":"曹雪芹",
"age":26
},{
"name":"西游记",
"author":"吴承恩",
"age":10
}
]
age=16
return render_template("control.html",age=age,books=books)
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>控制语句</title>
</head>
<body>
{% if age>18 %}
<div>您已成年</div>
{% elif age<18 %}
<div>您未成年</div>
{% else %}
<div>您刚成年</div>
{% endif %}
<table>
<tr>
<th>序号</th>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</tr>
<tbody>
{% for book in books %}
<tr>
<td>{{ loop.index }}</td>
{# loop函数显示序号 #}
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.age }}</td>
</tr>
{% else %}
<td>无数据</td>
{# 没有数据时,显示else后面语句 #}
{% endfor %}
</tbody>
</table>
</body>
</html>
模板结构
模板继承
重复模块可以继承
@app.route("/child1")
def child1():
return render_template("child1.html")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block bo %}
{% endblock %}
</body>
</html>
{% extends "base.html" %}
{% block title %}
我是子模板标题
{% endblock %}
{% block bo %}
你好呀
{% endblock %}
静态文件导入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css') }}">
<script src="{{ url_for('static',filename='js/my.js') }}"></script>
</head>
<body>
<img src="{{ url_for('static',filename='images/zhiliao.png') }}" alt="">
</body>
</html>