diff --git a/main.py b/main.py
index ab11c2f0874bbaa4b0fd9e36c1ced512a9fb7464..24e4b7c664adfbb71aa7f78a81717aa2764a7037 100644
--- a/main.py
+++ b/main.py
@@ -1,7 +1,9 @@
# 导入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类型
diff --git a/settings.py b/settings.py
index 94a133c880df01b8673cb838ba2fa67c60ba7989..c72887a3a41dfc1b851a8d20d0fcab156527636e 100644
--- a/settings.py
+++ b/settings.py
@@ -1 +1,2 @@
+# 设置应用秘钥(用于session的签名处理)
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
\ No newline at end of file
diff --git a/static/login.html b/static/login.html
new file mode 100644
index 0000000000000000000000000000000000000000..28c9d9d100229c091740aa2e4e25cf648cc9c1dd
--- /dev/null
+++ b/static/login.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Title
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..62bbcd68481416a53db14a5c01b3fd5d90033abb
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ 首页
+
+
+ 鞋子不会飞web工具箱
+我的模板html内容
+
{{ my_str }}
+
{{ my_int }}
+
+
+
\ No newline at end of file
diff --git a/templates/login.html b/templates/login.html
new file mode 100644
index 0000000000000000000000000000000000000000..28c9d9d100229c091740aa2e4e25cf648cc9c1dd
--- /dev/null
+++ b/templates/login.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Title
+
+
+
+
+
\ No newline at end of file
diff --git a/user/static/__init__.py b/user/static/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/user/static/login.html b/user/static/login.html
new file mode 100644
index 0000000000000000000000000000000000000000..28c9d9d100229c091740aa2e4e25cf648cc9c1dd
--- /dev/null
+++ b/user/static/login.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Title
+
+
+
+
+
\ No newline at end of file
diff --git a/user/templates/__init__.py b/user/templates/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/user/templates/login.html b/user/templates/login.html
new file mode 100644
index 0000000000000000000000000000000000000000..28c9d9d100229c091740aa2e4e25cf648cc9c1dd
--- /dev/null
+++ b/user/templates/login.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Title
+
+
+
+
+
\ No newline at end of file
diff --git a/user/views.py b/user/views.py
index f554957bb0bdca9030dddd6e5e4a091c3cf7de2e..2df29bb05aa8a505c25515ad7570a99110baf4e8 100644
--- a/user/views.py
+++ b/user/views.py
@@ -1,8 +1,10 @@
-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/')
+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 "登录失败"