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 "登录失败"