提交 1ce379e6 编写于 作者: 鞋子不会飞's avatar 鞋子不会飞

Merge branch 'dev' into 'master'

Dev

See merge request !2
# 导入Flask类
import json
import sys
from flask import Flask, render_template, make_response, Response, jsonify, redirect, url_for
from datetime import timedelta
from flask import Flask, render_template, make_response, Response, jsonify, redirect, url_for, session
from flask import request
from common.converter.converter import MobileConverter
......@@ -29,6 +31,10 @@ app = Flask(__name__, # 导入名称, 用于查询静态文件/模板文件的
# 应用的配置方式
# app.config.from_object(DefaultConfig)
app.config.from_pyfile('settings.py')
# 设置应用秘钥(用于session的签名处理)
app.secret_key = "o1Jx5NSCNHZOh2zfJHt6q+NsXaw="
# 设置session的有效期
app.permanent_session_lifetime = timedelta(days=7)
# 3.注册蓝图对象
app.register_blueprint(user_blu)
......@@ -38,6 +44,9 @@ app.register_blueprint(admin_blu)
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: mobile
app.url_map.converters['mobile'] = MobileConverter
# 设置应用秘钥(用于session的签名处理)
app.secret_key = "o1Jx5NSCNHZOh2zfJHt6q+NsXaw="
######################################################################应用顶层视图######################################################################
# 装饰器的作用是将路由映射到视图函数index
......@@ -61,10 +70,10 @@ def index():
# print(request.form.get('username'))
# 获取post文件
file_obj = request.files.get('avatar') # type: FileStorage
file_obj.save("img01.jpg") # 将上传的文件保存到本地
data_bytes = file_obj.read() # 读取出上传的文件数据 bytes
print(data_bytes)
# file_obj = request.files.get('avatar') # type: FileStorage
# file_obj.save("img01.jpg") # 将上传的文件保存到本地
# data_bytes = file_obj.read() # 读取出上传的文件数据 bytes
# print(data_bytes)
# 获取文本数据
# data_bytes = request.data # 返回bytes类型
......
# 设置应用秘钥(用于session的签名处理)
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<label for="">用户名: </label><input type="text" name="username"><br/>
<label for="">密码: </label><input type="password" name="password"><br/>
<input type="submit" value="登录"><br/>
</form>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>首页</title>
</head>
<body>
<p>鞋子不会飞web工具箱</p>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<label for="">用户名: </label><input type="text" name="username"><br/>
<label for="">密码: </label><input type="password" name="password"><br/>
<input type="submit" value="登录"><br/>
</form>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<label for="">用户名: </label><input type="text" name="username"><br/>
<label for="">密码: </label><input type="password" name="password"><br/>
<input type="submit" value="登录"><br/>
</form>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<label for="">用户名: </label><input type="text" name="username"><br/>
<label for="">密码: </label><input type="password" name="password"><br/>
<input type="submit" value="登录"><br/>
</form>
</body>
</html>
\ No newline at end of file
from flask import url_for
from flask import url_for, render_template, make_response, redirect, jsonify, session
from flask import request
from main import app
from user import user_blu
# 2.使用蓝图对象来注册路由
@user_blu.route('/')
def index():
......@@ -11,23 +13,195 @@ def index():
return "个人中心-首页"
@user_blu.route('/basic_info')
def basic_info():
return "个人中心-基本信息"
@user_blu.route('/articles')
def get_articles():
channel_id = request.args.get('channel_id')
return 'you wanna get articles of channel {}'.format(channel_id)
@user_blu.route('/upload', methods=['POST'])
@user_blu.route('/upload', methods=['GET', 'POST'])
def upload_file():
f = request.files['pic']
# with open('./demo.png', 'wb') as new_file:
# new_file.write(f.read())
f.save('./demo.png')
return 'ok'
#####################################如何在不同的场景里返回不同的响应信息##########################################
# 1)自定义响应对象
@user_blu.route('/demo0002')
def demo0002():
# 视图函数可以返回str/bytes, 并且都会最终包装为Response响应对象
# 手动创建响应对象 主要目的为设置响应头
response = make_response("demo_test") # type: Response
response.headers['a'] = 10
return response
# 2)返回模板
# 使用render_template方法渲染模板并返回
# 例如,新建一个模板index.html
@user_blu.route('/index001')
def index001():
mstr = 'Hello 黑马程序员'
mint = 10
return render_template('index.html', my_str=mstr, my_int=mint)
# 3)重定向
@user_blu.route('/demo002')
def demo002():
# 如果想要获取视图函数的动态url,必须手动设置路由变量的值(可以传参)
url = url_for("demo003", user_id=11)
return redirect('http://www.itheima.com')
# url发生变化,也不需要改代码,有利于url的重构
# return redirect(url_for(index)) # 配合url_for使用,index为endpoint
@user_blu.route('/demo003/<user_id>')
def demo003(user_id):
print(user_id)
return "hello"
# 4)返回json
@user_blu.route('/demo3')
def demo3():
json_dict = {
"user_id": 10,
"user_name": "laowang"
}
# json_str= json.dumps(json_dict ) # 没有指定content-type
# return json_str
# 可以将字典转为json字符串,并且自动设置content-type为application/json
return jsonify(json_dict)
# return jsonify(user_id=10, user_name="laowang") # 也支持关键字实参形式
# 5)自定义状态码和响应头
# 5.1) 元祖方式
# 可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
@user_blu.route('/demo4')
def demo4():
# 目的是为了和前端进行交互,定义一套自定义的交互规则
# return '状态码为 666', 666
# return '状态码为 666', 666, [('Itcast', 'Python')]
# return 响应体, 状态码, 响应头
return '状态码为 666', 666, {'Itcast': 'Python'}
# 5.2) make_response方式
@user_blu.route('/demo5')
def demo5():
# 手动创建响应对象,主要为了实现设置响应头
resp = make_response('make response测试')
resp.headers["Itcast"] = "Python"
resp.status = "404 not found"
return resp
#####################################如何在不同的场景里返回不同的响应信息##########################################
# 1)设置Cookie
@user_blu.route('/cookie')
def cookie():
# 每次请求时, 从请求头中取出cookie数据, 进行判断
is_help = request.cookies.get("is_help")
if is_help: # 说明已经显示过帮助信息
return "直接显示漫画"
# 第一次请求时, 将is_help设置到响应头的set_cookie字段
response = make_response("先显示帮助信息") # type: Response
# set_cookie的值必须是字符串
response.set_cookie('is_help', "1", max_age=86400) # max_age设置过期时间
# 删除cookie 本质max-age=0
# response.delete_cookie('is_help')
return response
# return "直接显示漫画"
# return "先显示帮助信息"
# 设置有效期
@user_blu.route('/set_cookie')
def set_cookie():
response = make_response('hello world')
response.set_cookie('username', 'itheima', max_age=3600)
return response
# 获取Cookie
@user_blu.route('/get_cookie')
def get_cookie():
resp = request.cookies.get('username')
return resp
@user_blu.route('/delete_cookie')
def delete_cookie():
response = make_response('hello world')
response.delete_cookie('username')
return response
@user_blu.route('/set_session')
def set_session():
session['username'] = 'itcast'
return 'set session ok'
@user_blu.route('/login')
def login():
# 获取session中的数据, 进行判断
name = session.get('username')
if name:
return "欢迎回来, %s" % name # 已登录
else:
return "首页" # 未登录
@user_blu.route('/get_session')
def get_session():
username = session.get('username')
return 'get session username {}'.format(username)
@user_blu.route('/login_use_session', methods=['GET', 'POST'])
def login_use_session():
if request.method == 'GET': # GET 展示页面
# 会读取出静态文件的内容包装为响应对象, 并且根据文件类型自动设置content-type
return app.send_static_file('login.html')
else: # POST 获取提交的表单数据, 进行登录认证
username = request.form.get('username')
password = request.form.get('password')
if username == 'zs' and password == '123':
# 开启session的有效机制 默认为31天有效
session.permanent = True
# 记录用户的身份信息 使用session状态保持
# session也是类字典对象 也可以像字典一样存取数据
session["name"] = 'zs'
# 删除session数据
# session.pop('name')
return "登录成功"
else:
return "登录失败"
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册