From 30d3cbc6a187b99a32df6e34649534207e57a87a Mon Sep 17 00:00:00 2001 From: leeexing <674023427@qq.com> Date: Wed, 20 Dec 2017 07:49:50 +0800 Subject: [PATCH 01/36] add books folder and add login.html --- blog/app.py | 52 ++++++++++++++++++++++++++++-- blog/static/css/main.css | 3 +- blog/static/css/main.less | 3 +- blog/static/js/main.js | 4 ++- blog/templates/base.html | 10 +++++- blog/templates/login/login.html | 24 ++++++++++++++ blog/templates/login/register.html | 16 ++++----- books/cookbooc.md | 19 +++++++++++ books/redis.md | 15 +++++++++ 9 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 blog/templates/login/login.html create mode 100644 books/cookbooc.md create mode 100644 books/redis.md diff --git a/blog/app.py b/blog/app.py index 5da121a..c11d96c 100644 --- a/blog/app.py +++ b/blog/app.py @@ -1,12 +1,19 @@ ''' my blog ''' -from flask import Flask, render_template, redirect, url_for +from flask import Flask, render_template, redirect, url_for, flash, request, session from flask_bootstrap import Bootstrap +import pymongo +import os + +client = pymongo.MongoClient('localhost', 27017) +user_db = client['myblog']['users'] app = Flask(__name__) bootstrap = Bootstrap(app) +app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or 'hard to guess string' + @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @@ -17,15 +24,54 @@ def internal_server_error(e): @app.route('/') def index(): + username = session.get('username') return render_template('index.html') @app.route('/user/', methods=['GET']) def user(name=None): return render_template('user.html', name=name) -@app.route('/register', methods=['GET']) +@app.route('/register', methods=['GET', 'POST']) def register(): - return render_template('login/register.html') + if request.method == 'POST': + username = request.form.get('username') + password = request.form.get('password') + print(username) + print(password) + user_isexist = user_db.find_one({'username': username}) + print(user_isexist) + if user_isexist: + flash('该用户名已被注册,请换一个用户名注册!') + return render_template('login/register.html') + else: + new_user = { + 'username': username, + 'password': password, + 'isAdmin': False + } + session['username'] = username + user_db.insert(new_user) + return redirect(url_for('login')) + else: + return render_template('login/register.html') + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + username = request.form.get('username') + password = request.form.get('password') + has_user = user_db.find_one({'username': username, 'password': password}) + print(has_user) + if has_user: + session['username'] = username + return redirect(url_for('index')) + else: + flash('用户名或密码错误!') + return redirect(url_for('login')) + else: + return render_template('login/login.html') + if __name__ == "__main__": + # app.run() app.run(debug=True) diff --git a/blog/static/css/main.css b/blog/static/css/main.css index c6649f6..259125c 100644 --- a/blog/static/css/main.css +++ b/blog/static/css/main.css @@ -37,7 +37,8 @@ width: 60%; margin: 50px auto; padding: 30px; - border: 1px solid #eee; + border: 1px solid #ddd; border-radius: 5px; box-shadow: 1px 1px 2px #ddd; + background-color: rgba(255, 255, 255, 0.5); } diff --git a/blog/static/css/main.less b/blog/static/css/main.less index 3bd13f8..6b8c837 100644 --- a/blog/static/css/main.less +++ b/blog/static/css/main.less @@ -62,7 +62,8 @@ width: 60%; margin: 50px auto; padding: 30px; - border: 1px solid #eee; + border: 1px solid #ddd; border-radius: 5px; box-shadow: 1px 1px 2px #ddd; + background-color: rgba(255,255,255,.5) } \ No newline at end of file diff --git a/blog/static/js/main.js b/blog/static/js/main.js index 42602e5..1694764 100644 --- a/blog/static/js/main.js +++ b/blog/static/js/main.js @@ -1 +1,3 @@ -console.log('Woooooo~!') \ No newline at end of file +$(function() { + console.log(7788) +}) \ No newline at end of file diff --git a/blog/templates/base.html b/blog/templates/base.html index 9320bdb..04e5573 100644 --- a/blog/templates/base.html +++ b/blog/templates/base.html @@ -29,7 +29,7 @@
  • Home
  • @@ -51,7 +53,7 @@ {% block content %}
    -
    54654654564564
    +
    {% for message in get_flashed_messages() %} diff --git a/blog/templates/login/login.html b/blog/templates/login/login.html index 31debf5..1fd8e5f 100644 --- a/blog/templates/login/login.html +++ b/blog/templates/login/login.html @@ -15,7 +15,10 @@
    +
    diff --git a/blog/templates/login/register.html b/blog/templates/login/register.html index b4a716e..f2664d7 100644 --- a/blog/templates/login/register.html +++ b/blog/templates/login/register.html @@ -17,11 +17,6 @@ -
    - -
    diff --git a/books/cookbooc.md b/books/cookbooc.md index aaf77e3..719b165 100644 --- a/books/cookbooc.md +++ b/books/cookbooc.md @@ -16,4 +16,14 @@ ## 元编程 -## 模块与包 \ No newline at end of file +## 模块与包 +1、将自己的代码组织成由很多分层模块构成的包 +``` + 在每个目录(文件夹)里面都定义一个`__init__.py`文件 + 这样就可以像使用命名空间一样通过`.`加载模块 + 1.1 可以在`__init__.py`里面做点文章 + `from . import jpg` | jpg.py + `from . import png` | png.py + 那么就可以直接引用目录就可以导入 目录里面的包(init里面导入的) +``` +2、 \ No newline at end of file diff --git a/books/git.md b/books/git.md new file mode 100644 index 0000000..d9d2709 --- /dev/null +++ b/books/git.md @@ -0,0 +1,28 @@ +# git使用 + +## git commit -m 和 git commit -am "" 的却别 +1、git commit -m 用于提交暂存区的文件 | 如果`add`过的文件修改,直接使用这句,不会提交修改后的内容-- 因为新增的内容没有提交到暂存区 +2、git commit -am 用于提交跟踪过的文件 | 就是如果`add`过的文件修改了,那么这是可以将修改过的内容一起提交 +总结:使用git commit -am可以省略使用git add命令将已跟踪文件放到暂存区的功能 + + +## git add -A和 git add . git add -u + git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。 + + git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写) + + git add -A :提交所有变化;是上面两个功能的合集(git add --all的缩写) + +## 分支 +1、新建分支 + git checkout -b branchame +2、切换分支 + git checkout branchname +3、合并分支 + git checkout master | git merge branchname +4、获取分支 + git branch +5、删除分支 + git checkout -d branchname +6、合并分支时产生冲突 + git status | git mergetool | 手动解决冲突地方 | git status | git merge branchname \ No newline at end of file From 367a2708b9b55e72f21d695394dc8547c0fde4e1 Mon Sep 17 00:00:00 2001 From: leeexing <674023427@qq.com> Date: Wed, 20 Dec 2017 18:00:05 +0800 Subject: [PATCH 03/36] blog seesion cookie is puzzled --- README.md | 10 +++++++++- blog/app.py | 13 ++++++++----- blog/templates/base.html | 9 ++++++--- blog/templates/login/login.html | 4 ++-- blog/templates/login/register.html | 6 +++--- books/{cookbooc.md => cookbook.md} | 0 6 files changed, 28 insertions(+), 14 deletions(-) rename books/{cookbooc.md => cookbook.md} (100%) diff --git a/README.md b/README.md index 6bebcd3..4ca1601 100644 --- a/README.md +++ b/README.md @@ -27,23 +27,30 @@ 2、如果没有指定时间,那么浏览器关闭那么session就自动结束 session.permanent = True -- 设置过期时间为31天 app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) -- 设置过期时间为7天 + 3、get 传参 url_for(url, q='leeing') -- url?q=leeing 后台通过 request.args.get('key') -- 获取get请求参数 + 4、post请求 request.form.get('key') -- 获取表单数据 request.values.get('key') -- 获取所有参数 + 5、g属性 保存全局变量 g.username = xxx | g.ip = yyy g对象是专门用来保存用户的数据的 - g对象在一次请求中的所有代码的地方,都是可以使用的 + g对象在一次请求中的所有代码的地方,都是可以使用的 | 当你第二次请求的时候`g`就不是同一个了 | 范围是当前请求内 + * 所以实用性还不如 session,因为g变量保存的周期不常 + 6、hook 钩子函数 before_request | 在请求之前执行 | 是在视图函数执行之前执行的 | 只是一个装饰器 * 可以截取所有的访问 | 即在所有请求进入`app.route`装饰的函数前先被处理一次 after_request * 在用户请求得到函数响应后再执行一次 | 这个执行是在`函数返回数据前`被调用 | 形成了`response`,但未返回给用户 context_processor | 返回结果必须是 dict | 上下文处理器,包含上下文共用的变量 | 只是一个装饰器 + * 目的是让所有自定义变量在模板中可见 + 7、优雅的重定向所有未登录用户到登录界面 使用`@app.before_request`hook钩子进行登录验证 * 两个条件判断 | `session.get('username')` | `request.endpoint not in ('login','register','static')` | 否则会不断重定向 `302` @@ -53,6 +60,7 @@ app.register_blueprint(file, url_prefix='file') 这种情况下如果视图函数重名 | 需要带上前面的 `user`、`file` 才行呢 安装`flask-login` | 但是每个需要认证的路由都还必须添加一个`@login_required`的装饰器 + 8、 ## crawler diff --git a/blog/app.py b/blog/app.py index 0252248..59a703d 100644 --- a/blog/app.py +++ b/blog/app.py @@ -5,11 +5,14 @@ from flask_bootstrap import Bootstrap import server.db as db import os +from datetime import timedelta app = Flask(__name__) bootstrap = Bootstrap(app) app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') or 'hard to guess string' +app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=1) +# session.permanent = True @app.errorhandler(404) def page_not_found(e): @@ -47,10 +50,7 @@ def register(): if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') - print(username) - print(password) user_isexist = db.user_db.find_one({'username': username}) - print(user_isexist) if user_isexist: flash('该用户名已被注册,请换一个用户名注册!') return render_template('login/register.html') @@ -69,14 +69,17 @@ def register(): @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': + print(request.values) username = request.form.get('username') password = request.form.get('password') + remember_me = request.form.get('rememberme') == 'on' + print(remember_me) login_user = db.user_db.find_one({'username': username, 'password': password}) print(login_user) if login_user: session['username'] = username if login_user.get('isAdmin'): - session['isAdmin'] = True + session['is_admin'] = True return redirect(url_for('index')) else: flash('用户名或密码错误!') @@ -86,7 +89,7 @@ def login(): @app.route('/logout') def logout(): - session.pop('username') + session.clear() return redirect(url_for('login')) if __name__ == "__main__": diff --git a/blog/templates/base.html b/blog/templates/base.html index c90e3cd..937b48a 100644 --- a/blog/templates/base.html +++ b/blog/templates/base.html @@ -37,9 +37,12 @@