山西建设工程信息网站,黄页网址18岁以下勿入,wordpress手机边距,制作单页网站前言 2023-8-11 以前对网站开发萌生了想法#xff0c;又有些急于求成#xff0c;在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣#xff0c;存在许多模糊或不太理解的地方#xff0c;只会照葫芦画瓢。
而当自己想开发一个什么网站的时…前言 2023-8-11 以前对网站开发萌生了想法又有些急于求成在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣存在许多模糊或不太理解的地方只会照葫芦画瓢。
而当自己想开发一个什么网站的时就如同摸着石头过河常在许多小问题上卡住不知怎么实现也不知道需要去学习什么才能实现。例如要做一个聊天室程序我却不知道在一方发出消息时如何在另一方实时地显示出来思虑许久而终归于放弃。
学习系统且详细的知识有其好处它可以冲退我那种徒手在黑暗中摸索的感觉。读了“狼书”的两个章节自觉很有收获此前的许多疑惑也得到了解答。然凡事各有弊益啃书不是易事还需下苦功夫。
曾有人对我说看视频会更有效率。也许他是对的但我好像更喜欢书籍给我的感觉。但有些讽刺的是大学至今我却也没看下来多少书而时间在我休息的时候它仍努力奔跑两载一晃而过。而不少人也是这相似的困境吧
回到本文它是一篇读书笔记参杂少许个人想法但含量不高所记零散主要是作为个人提纲备忘或许对诸位而言阅读价值不高。若想学习 Flask 框架我还是很推荐去读“狼书”原著的。 文章目录 前言开始Git使用 1 初识Flask1.1 搭建开发环境1.2 简单示例 2 Flask与HTTP2.1 重定向回上一个页面2.2 使用AJAX技术发送异步请求2.3 HTTP服务器推送2.4 Web安全防范 开始
5个难度递增的案例留言板SayHello个人博客Bluelog图片社交网站Albumy待办事项程序Todoism聊天室CatChat。
前端学习 Web很多程序离不开javascript它可以方便、简洁地实现很多页面按逻辑和功能。
了解Githttps://try.github.io/
文本编辑器 作者的博客http://greyli.com
Git使用
克隆本书代码仓库
git clone https://github.com/greyli/helloflask.git查看当前项目仓库中包含的所有标签
git tag -n签出对应标签版本的代码
git checkout foo签出前对文件做了修改需要撤销
git reset --hard使用diff命令比较两个标签对应版本之间的变化
git diff foo bar使用git客户端直观查看版本变化
gitk定期使用git fetch命令来更新本地仓库
git fetch --all
git fetch --tags
git reset --hard origin/master在本地复制新的派生仓库后可以在本地自由修改其中的代码
git clone https://github.com/你的用户名/helloflask.git1 初识Flask
Web框架可以让我们不用关心底层的请求响应处理更方便地编写Web程序。
两个主要依赖p3
WSGIWeb Server Gateway InterfaceWeb服务器网关接口的工具集——Werkzeughttp://werkzeug.pocoo.org/Jinja2模板引擎
1.1 搭建开发环境
Pipenvpip的加强版让包安装、包依赖管理、虚拟环境管理更加方便。
创建虚拟环境在项目根目录即helloflask文件夹中使用pipenv install命令。Pipfile文件列出的依赖包也会一并被安装。 显示激活虚拟环境Pipenv会自动从项目目录下的.env文件中加载环境变量。
# 激活
pipenv shell
# 退出
exit临时使用虚拟环境中的python解释器更推荐
pipenv run python hello.py查看当前环境下的依赖情况
pipenv graph关于Pipfile项目的更多情况请访问其主页。 使用pipenv install命令安装包时都是安装到虚拟环境中。相当于使用pip在激活虚拟环境的情况下安装包。 更新flask版本(书中为flask-1.0.2)
pipenv update flask集成开发环境pycharm专业版提供了更多针对Flask开发的功能比如创建Flask项目模板Jinja2语法高亮与Flask命令行功能集成等。
设置Python解释器好像已经不需要了因为PyCharm未集成支持Pipenv。p10
1.2 简单示例
from flask import Flask
app Flask(__name__)app.route(/)
def index():return h1Hello Flask!/h1Flask类表示一个Flask程序实例化这个类就得到了我们的程序实例app。__name__对于文件app.py而言值即为“app”它帮助Flask在相应的文件夹里找到需要的资源比如模板和静态文件。p12
注册路由路由负责管理URL和函数之间的映射。
一个视图函数可以绑定多个路由。动态路由可以传递参数并可设置默认参数。 注Flask内置一个开发服务器但在实际生产环境中需要使用性能更好的生产服务器。
启动开发服务器
# 未启动虚拟环境下使用
pipenv run flask run
# 在虚拟环境中
flask run
# 命令未找到
python -m flask runapp.run()方法也可启动开发服务器已经不推荐使用。
flask寻找程序实例
在当前目录下名为app.py或wsgi.py的文件中寻找名为app的程序实例。根据环境变量FLASK_APP寻找。
# 在linux
$ export FLASK_APPhello
# 在windowsset FLASK_APPhello管理环境变量使用python-dotenv包从.env或.flaskenv文件加载。其中.env文件存放一些敏感数据。
pipenv install python-dotenv可在.flaskenv写入
# 默认为production(生产环境)开发模式将打开调试器和重载器。
FLASK_ENVdevelopment使用Pycharm的运行配置而不使用命令行在Run -- Edit Configurationsp19
使服务器外部可见让局域网用户可以通过你的内网IP进行访问。想要公网访问可以考虑内网穿透工具、端口转发工具等如 ngrok、Localtunnel。
flask run --host0.0.0.0flask的环境变量可通过FLASK_COMMAND_OPTION设置各种选项。
重载器安装 Watchdog。Werkzeug内置有stat重载器但耗电严重且准确性一般。
# dev: 开发依赖的包
pipenv install watchdog --dev打开PythonShell使用flask打开的shell自动包含程序上下文并且已经导入了app实例。
flask shellFlask扩展使用Flask提供的接口编写的Python库。扩展可以加速开发但也会降低灵活性并可能存在bug。
Flask项目配置可能用到Flask提供的配置、扩展提供的、程序特定的配置。它们用Flask对象的app.config属性作为统一的接口。
Flask配置章节https://flask.pocoo.org/docs/latest/config/
app.config[ADMIN_NAME] Peter
# 一次加载多个值
app.config.update()方法URL使用url_for()方便url规则的修改。
相对url与绝对urlp24
自定义Flask命令
Click官方文档自定义命令http://click.pocoo.org/6/
app.cli.command()
def hello():click.echo(Hello, Human!)flask hello
Hello, Human!视图函数之名可以溯源至MVC架构即”模型 - 视图 - 控制器”。但flask并不是MVC架构的框架因为没有内置数据模型的功能需使用扩展视图函数成为控制器函数才更加合适。p28
2 Flask与HTTP
request对象常用的属性和方法p43
Response类常用属性和方法p48
查看路由列表这个列表由app.url_map解析得到。其中static为Flask添加的特殊路由用来访问静态文件。 flask routesFlask内置的URL变量转换器p37
URL规则中的转换器转换器:变量名
app.route(goback/int:year)
def go_back(year):return pWelcome to %d!/p % (2018 - year)请求钩子也称回调函数可以用来注册在请求处理的不同阶段执行的处理函数如预处理、后处理它们使用装饰器 实现。p58
响应大多数情况下我们只负责返回响应的主体内容而不负责首部及各种字段。Flask会调用make_response()方法将视图函数返回值转换为响应对象。当然响应也可以包含响应主体、状态码、首部字段 三个部分内容。
可使用redirect(url字符串)方法重定向。
app.route(/)
def hello_flask():return , 302, {Location:https://www.baidu.com}注状态码不可儿戏如将上面的302改为202则重定向会失效。 错误响应在视图函数中使用abort(状态码)例如
app.route(/404)
def not_found():abort(404)响应格式在 HTTP 响应中数据可以通过多种格式传输默认为 HTML。可以设置不同的 MIME 类型来标识不同的数据格式MIME 类型在 Content-Type 字段中定义。
# method 1 - 修改响应对象的属性
# plain 纯文本
from flask import make_response
...
response make_response(hello)
response.mimetype text/plain
# method 2 - 设置首部字段
response.headers[Content-Type] text/html; charsetutf-8XMLapplication/xml一般作为 AJAX 请求的响应格式或是 Web API 的响应格式。 JSONapplication/json指 JavaScript Object NotationJavaScript对象表示法更轻量、易解析。 json模块的dumps()方法可以将python中的字典、列表、元组数据序列化为json字符串。
# 1 - python标准库的json模块
response make_response(json.dumps(data))
response.mimetype application/json
return response
# 2 - 使用flask包装的jsonify()函数
return jsonify(data)CookieHTTP 是无状态协议。Cookie是保存在浏览器上的小型文本数据保存一定时间在下一次向同一个服务器发送请求时附带这些数据。但明文存储存在安全隐患。
使用set_cookie()方法设置参数见p68从cookies属性获取。
Session在Flask中session对象用来存储加密的cookie。
设置程序密钥通过Flask.secret_key属性或环境变量SECRET_KEY可保存在.env文件在脚本中通过getenv()方法获取。
import os
app.secret_key os.getenv(SECRET_KEY, secret string)疑问写进了环境变量还需再脚本中手动获取那我随便用个环境变量名称是不是也可以 疑问看不懂使用session对象存储的Cookie用户可以看到其加密后的值但无法修改它。因为session中的内容使用密钥进行签名一旦数据被修改签名的值也会变化。这样再读取时就会验证失败对应的session值也会失效。 p51 session cookie的保存时间 上下文Flask中有两种上下文程序上下文 和请求上下文 。
两种上下文在视图函数中都会自动激活这也意味折一些依赖于上下文的函数只能在视图函数中使用如url_for()、jsonify()等。
也可手动激活程序上下文 from app import appfrom flask import current_app# 方法1with app.app_context():... current_app.name# 方法2app_ctx app.app_context()app_ctx.push()current_app.nameapp_ctx.pop()# 激活请求上下文类似from app import appfrom flask import requestwith app.test_request_context(/hello):...疑惑g、request等对象如何区分不同的客户端 上下文钩子使用它注册的回调函数会在程序上下文被销毁时调用。
app.teardown_appcontext
def teardown_db(exception):...db.close()2.1 重定向回上一个页面
利用referrer或URL的查询参数。p59
referrer即访问来源。当用户在某个站点单击链接浏览器向新链接所在的服务器发起请求请求的数据中包含的HTTP_REFERER字段记录了用户所在的原站点URL。 疑惑书中判断url是否安全的代码如下使我困惑了许久既然test_url中也与request.host_url做了拼接那最后的netloc不是必然相同吗 后来我查找了urljoin(base, url)函数的处理机制 如果url是一个相对URL那么urljoin会从url中获取路径部分并于base中获取的部分合并如果url是一个绝对URL则urljoin会直接返回url。 那么在什么情况下is_safe_url函数的返回值才为False呢 首先target是一个绝对URL。同时该绝对URL的协议或主机不是本机。 综上还是感觉该函数的逻辑写得有些隐晦了不便于理解肯定不能是我太笨。 def is_safe_url(target):ref_url urlparse(request.host_url)test_url urlparse(urljoin(request.host_url, target))return test_url.scheme in (http, https) and \ref_url.netloc test_url.netloc2.2 使用AJAX技术发送异步请求
jQuery中和AJAX相关的方法和具体用法http://api.jquery.com/category/ajax/ 前言 在传统的Web应用中程序的操作都是基于请求响应循环来实现的。每当页面状态需要变动或是需要更新数据时都伴随折一个发向服务器的请求。当服务器响应时整个页面会重载并渲染新页面。 频繁更新页面会牺牲性能且影响用户体验。 AJAX是指异步Javascript和XMLAsynchronous JavaScript And XML是一系列技术的组合体如XMLHttpRequest、JavaScript、DOM。它让Web程序更像是程序而非一堆用链接和按钮链接起来的网页资源。 可以使用 jQuery 实现AJAX操作函数ajax()可以发送AJAX请求。 2.3 HTTP服务器推送
推送技术对比https://stackoverflow.com/a/12855533/5511489
传统轮询长轮询SSEServer-Sent EventsWebsocket
2.4 Web安全防范
OWASPOpen Web Application Security Project开放式Web程序安全项目https://www.owasp.org 。p66
常见攻击方式
注入攻击XSS攻击Cross-Site Scripting跨站脚本将代码注入被攻击者的网站CSRF攻击Cross Site Request Forgery跨站请求伪造伪造用户的登陆状态。 提示虽然在实际开发中通过在”删除“按钮中加入链接来删除资源非常方便但安全问题应该作为编写代码时的第一考量应该将这些按钮内嵌在使用了POST方法的form元素中。攻击者就无法通过GET请求来修改用户的数据。 疑惑未理解csrf攻击的防御原理。 文章转载自: http://www.morning.crdtx.cn.gov.cn.crdtx.cn http://www.morning.krqhw.cn.gov.cn.krqhw.cn http://www.morning.dpppx.cn.gov.cn.dpppx.cn http://www.morning.brbmf.cn.gov.cn.brbmf.cn http://www.morning.cdlewan.com.gov.cn.cdlewan.com http://www.morning.lpmlx.cn.gov.cn.lpmlx.cn http://www.morning.rlrxh.cn.gov.cn.rlrxh.cn http://www.morning.tbwsl.cn.gov.cn.tbwsl.cn http://www.morning.cwqpl.cn.gov.cn.cwqpl.cn http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn http://www.morning.ktmbr.cn.gov.cn.ktmbr.cn http://www.morning.yhglt.cn.gov.cn.yhglt.cn http://www.morning.cpktd.cn.gov.cn.cpktd.cn http://www.morning.yhplt.cn.gov.cn.yhplt.cn http://www.morning.kmprl.cn.gov.cn.kmprl.cn http://www.morning.cpljq.cn.gov.cn.cpljq.cn http://www.morning.cfpq.cn.gov.cn.cfpq.cn http://www.morning.ytbr.cn.gov.cn.ytbr.cn http://www.morning.ywpcs.cn.gov.cn.ywpcs.cn http://www.morning.sgqw.cn.gov.cn.sgqw.cn http://www.morning.jpwkn.cn.gov.cn.jpwkn.cn http://www.morning.mtxrq.cn.gov.cn.mtxrq.cn http://www.morning.djbhz.cn.gov.cn.djbhz.cn http://www.morning.fpxsd.cn.gov.cn.fpxsd.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.lnsnyc.com.gov.cn.lnsnyc.com http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.stfdh.cn.gov.cn.stfdh.cn http://www.morning.srmpc.cn.gov.cn.srmpc.cn http://www.morning.mjytr.cn.gov.cn.mjytr.cn http://www.morning.mpwgs.cn.gov.cn.mpwgs.cn http://www.morning.cnkrd.cn.gov.cn.cnkrd.cn http://www.morning.xhfky.cn.gov.cn.xhfky.cn http://www.morning.smry.cn.gov.cn.smry.cn http://www.morning.skpdg.cn.gov.cn.skpdg.cn http://www.morning.bykqg.cn.gov.cn.bykqg.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn http://www.morning.sqqpb.cn.gov.cn.sqqpb.cn http://www.morning.kwhrq.cn.gov.cn.kwhrq.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn http://www.morning.wnmdt.cn.gov.cn.wnmdt.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.qdrhf.cn.gov.cn.qdrhf.cn http://www.morning.tmrjb.cn.gov.cn.tmrjb.cn http://www.morning.gypcr.cn.gov.cn.gypcr.cn http://www.morning.fgrcd.cn.gov.cn.fgrcd.cn http://www.morning.zmwzg.cn.gov.cn.zmwzg.cn http://www.morning.guofenmai.cn.gov.cn.guofenmai.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.qqfcf.cn.gov.cn.qqfcf.cn http://www.morning.rcqyk.cn.gov.cn.rcqyk.cn http://www.morning.xqgtd.cn.gov.cn.xqgtd.cn http://www.morning.wfyzs.cn.gov.cn.wfyzs.cn http://www.morning.hlppp.cn.gov.cn.hlppp.cn http://www.morning.fmqw.cn.gov.cn.fmqw.cn http://www.morning.pypbz.cn.gov.cn.pypbz.cn http://www.morning.bwdnx.cn.gov.cn.bwdnx.cn http://www.morning.lxqkt.cn.gov.cn.lxqkt.cn http://www.morning.qypjk.cn.gov.cn.qypjk.cn http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.wklyk.cn.gov.cn.wklyk.cn http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn http://www.morning.bojkosvit.com.gov.cn.bojkosvit.com http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.zzfqn.cn.gov.cn.zzfqn.cn http://www.morning.mnlk.cn.gov.cn.mnlk.cn http://www.morning.mqbsm.cn.gov.cn.mqbsm.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.3dcb8231.cn.gov.cn.3dcb8231.cn http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.tnktt.cn.gov.cn.tnktt.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.mwzt.cn.gov.cn.mwzt.cn http://www.morning.dwzwm.cn.gov.cn.dwzwm.cn