<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jspython的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jspython</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jspython]]></copyright><item><title><![CDATA[python定时任务最强框架APScheduler详细教程]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106426801</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106426801</guid><author>jspython</author><pubDate>Fri, 29 May 2020 15:48:03 +0800</pubDate><description><![CDATA[APScheduler定时任务
上次测试女神听了我的建议，已经做好了要给项目添加定时任务的决定了。但是之前提供的四种方式中，她不知道具体选择哪一个。为了和女神更近一步，我把我入行近10年收藏的干货免费拿出来分享给女神，希望女神凌晨2点再找我的时候，不再是因为要给他调程序了。
Python中定时任务的解决方案，总体来说有四种，分别是：crontab、 scheduler、 Celery、 APScheduler，其中 crontab不适合多台服务器的配置、scheduler太过于简单、 Celery依赖的软件]]></description><category></category></item><item><title><![CDATA[Python定时任务实现的四种方案]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106426595</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106426595</guid><author>jspython</author><pubDate>Fri, 29 May 2020 15:38:38 +0800</pubDate><description><![CDATA[昨晚凌晨两点，小编接到女神的电话，心里正心猿意马，没想到电话中的女神竟带着哭腔和我说老板让她现在就去公司加班，我很好奇的问她什么事情要这么晚去?女神委屈的说：“因为我们公司这个产品是针对美国用户，存在时差”说完又哭了起来。唉，小编心想终于有机会在女神面前露一手了，听我慢慢道来。
在开发一个自动化测试平台，其中有一个功能是必不可少的，那就是定时任务调度。比如现在你的项目需要凌晨2点跑测试，你一个女孩子不可能真的2点钟起床跑到公司去执行测试吧，这时候定时任务就显得尤为重要，可以说是作为一个测试平台的标配了
用 ]]></description><category></category></item><item><title><![CDATA[图文并茂，详细讲解Git底层存储原理]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106425663</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106425663</guid><author>jspython</author><pubDate>Fri, 29 May 2020 14:59:00 +0800</pubDate><description><![CDATA[自从小学妹学完定时任务后（详情请看上篇文章），对我那是百般仰慕，遇到问题第一时间就会想到我（是的，要的就是这种效果）。这不，小学妹今天又找我了，今天的问题是什么呢？听我细细道来…
原来小学妹在公司中，用的是 Git的代码管理工具（还不知道这个软件的要面壁啦~）。有一天不知道发生什么了，文件夹中所有代码都被删掉了，但是只留下本地一个 .git文件夹，这可把小学妹急坏了，刚写完一个大功能，还没来得急提交到远程服务器，明天就要开始内测了，重写已经来不及了…
听完小学妹的诉求后，我慢悠悠的跟她说：小事儿一桩，交给学]]></description><category></category></item><item><title><![CDATA[一台电脑如何同时玩转GitHub和公司Git服务器？]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106209373</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106209373</guid><author>jspython</author><pubDate>Tue, 19 May 2020 10:42:26 +0800</pubDate><description><![CDATA[最近有个小学妹刚入职新公司，公司用的是Git版本管理工具，然后她其实自己也经常玩Github，Git用起来基本操作也不大。但是现在她遇到一个小问题，相信这个问题很多程序员（媛）也经常遇到。什么问题呢？来跟大家唠一唠。
大家都知道，在多人协作开发中，我们需要把代码提交到Git服务器的。但是并不是所有人都可以往服务器上推送代码，只有有相应权限的人才能推送，所以就涉及到如何对服务器进行授权的问题。现在授权方式有两种，一种是HTTP/HTTPS协议，另外一种是SSH Key协议。
HTTP/HTTPS协议好处是方便]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（20）-查询操作]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106188117</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106188117</guid><author>jspython</author><pubDate>Mon, 18 May 2020 10:39:01 +0800</pubDate><description><![CDATA[查询操作
查找是数据库操作中一个非常重要的技术。查询一般就是使用filter、exclude以及get三个方法来实现。我们可以在调用这些方法的时候传递不同的参数来实现查询需求。在ORM层面，这些查询条件都是使用field+__+condition的方式来使用的。以下将那些常用的查询条件来一一解释。
查询条件
exact：
使用精确的=进行查找。如果提供的是一个None，那么在SQL层面就是被解释为NULL。示例代码如下：
article = Article.objects.get(id__exact=14)]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（49）-redis教程]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106121493</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106121493</guid><author>jspython</author><pubDate>Thu, 14 May 2020 15:46:05 +0800</pubDate><description><![CDATA[redis教程：
概述
redis是一种nosql数据库,他的数据是保存在内存中，同时redis可以定时把内存数据同步到磁盘，即可以将数据持久化，并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关参考文档：http://redisdoc.com/index.html
redis使用场景：

登录会话存储：存储在redis中，与memcached相比，数据不会丢失。
排行版/计数器：比如一些秀场]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（48）-memcached]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106121438</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106121438</guid><author>jspython</author><pubDate>Thu, 14 May 2020 15:44:31 +0800</pubDate><description><![CDATA[memcached
什么是memcached：

memcached之前是danga的一个项目，最早是为LiveJournal服务的，当初设计师为了加速LiveJournal访问速度而开发的，后来被很多大型项目采用。官网是www.danga.com或者是memcached.org。
Memcached是一个高性能的分布式的内存对象缓存系统，全世界有不少公司采用这个缓存项目来构建大负载的网站，来分担数据库的压力。Memcached是通过在内存里维护一个统一的巨大的hash表，memcached能存储各种各样的]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（47）-权限和分组]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106121364</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106121364</guid><author>jspython</author><pubDate>Thu, 14 May 2020 15:42:30 +0800</pubDate><description><![CDATA[权限和分组
登录、注销和登录限制：
登录
在使用authenticate进行验证后，如果验证通过了。那么会返回一个user对象，拿到user对象后，可以使用django.contrib.auth.login进行登录。示例代码如下：
user = authenticate(username=username, password=password)
if user is not None:
    if user.is_active:
        login(request, user)

注销：
注销，或]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（46）-用户对象]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106121306</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106121306</guid><author>jspython</author><pubDate>Thu, 14 May 2020 15:40:15 +0800</pubDate><description><![CDATA[User模型
User模型是这个框架的核心部分。他的完整的路径是在django.contrib.auth.models.User。以下对这个User对象做一个简单了解：
字段：
内置的User模型拥有以下的字段：

username： 用户名。150个字符以内。可以包含数字和英文字符，以及_、@、+、.和-字符。不能为空，且必须唯一！
first_name：歪果仁的first_name，在30个字符以内。可以为空。
last_name：歪果仁的last_name，在150个字符以内。可以为空。
email：]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（45）-概述]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106120028</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106120028</guid><author>jspython</author><pubDate>Thu, 14 May 2020 15:38:25 +0800</pubDate><description><![CDATA[验证和授权概述
Django有一个内置的授权系统。他用来处理用户、分组、权限以及基于cookie的会话系统。Django的授权系统包括验证和授权两个部分。验证是验证这个用户是否是他声称的人（比如用户名和密码验证，角色验证），授权是给与他相应的权限。Django内置的权限系统包括以下方面：

用户。
权限。
分组。
一个可以配置的密码哈希系统。
一个可插拔的后台管理系统。

使用授权系统：
默认中创建完一个django项目后，其实就已经集成了授权系统。那哪些部分是跟授权系统相关的配置呢。以下做一个简单列表：
]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（44）-注入SQL]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119924</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119924</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:52:09 +0800</pubDate><description><![CDATA[SQL注入
所谓SQL注入，就是通过把SQL命令插入到表单中或页面请求的查询字符串中，最终达到欺骗服务器执行恶意的SQL命令。具体来说，它是利用现有应用程序，将（恶意的）SQL命令注入到后台数据库引擎执行的能力，它可以通过在Web表单中输入（恶意）SQL语句得到一个存在安全漏洞的网站上的数据库，而不是按照设计者意图去执行SQL语句。 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的。
场景：
比如现在数据库中有一个front_user表，表结构如下：
class User(m]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（43）-点击劫持攻击]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119897</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119897</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:51:13 +0800</pubDate><description><![CDATA[clickjacking攻击：
clickjacking攻击又称作点击劫持攻击。是一种在网页中将恶意代码等隐藏在看似无害的内容（如按钮）之下，并诱使用户点击的手段。
clickjacking攻击场景：
场景一：
如用户收到一封包含一段视频的电子邮件，但其中的“播放”按钮并不会真正播放视频，而是链入一购物网站。这样当用户试图“播放视频”时，实际是被诱骗而进入了一个购物网站。
场景二：
用户进入到一个网页中，里面包含了一个非常有诱惑力的按钮A，但是这个按钮上面浮了一个透明的iframe标签，这个iframe标签]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（42）-XSS攻击]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119871</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119871</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:50:23 +0800</pubDate><description><![CDATA[XSS攻击
XSS（Cross Site Script）攻击又叫做跨站脚本攻击。他的原理是用户在使用具有XSS漏洞的网站的时候，向这个网站提交一些恶意的代码，当用户在访问这个网站的某个页面的时候，这个恶意的代码就会被执行，从而来破坏网页的结构，获取用户的隐私信息等。
XSS攻击场景：
比如A网站有一个发布帖子的入口，如果用户在提交数据的时候，提交了一段js代码比如：&lt;script&gt;alert("hello world");&lt;/script&gt;，然后A网站在渲染这个帖子的时候，直接把这个]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（41）-CSRF攻击]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119835</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119835</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:49:42 +0800</pubDate><description><![CDATA[CSRF攻击：
CSRF攻击概述：
CSRF（Cross Site Request Forgery, 跨站域请求伪造）是一种网络的攻击方式，它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患，比如 SQL 脚本注入，跨站域脚本攻击等在近年来已经逐渐为众人熟知，很多网站也都针对他们进行了防御。然而，对于大多数人来说，CSRF 却依然是一个陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在着 CSRF 漏洞，从而被黑客攻击而使 Gmail 的用户造成巨大的损失。
CSRF攻击]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（40）-中间件]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119819</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119819</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:48:43 +0800</pubDate><description><![CDATA[中间件
中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前，我们可以使用中间件来做一些相关的事情，比如可以判断当前这个用户有没有登录，如果登录了，就绑定一个user对象到request上。也可以在response到达浏览器之前，做一些相关的处理，比如想要统一在response上设置一些cookie信息等。
自定义中间件：
中间件所处的位置没有规定。只要是放到项目当中即可。一般分为两种情况，如果中间件是属于某个app的，那么可以在这个app下面创建一个pyth]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（39）-上下文处理器]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119801</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119801</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:48:01 +0800</pubDate><description><![CDATA[上下文处理器
上下文处理器是可以返回一些数据，在全局模板中都可以使用。比如登录后的用户信息，在很多页面中都需要使用，那么我们可以放在上下文处理器中，就没有必要在每个视图函数中都返回这个对象。
在settings.TEMPLATES.OPTIONS.context_processors中，有许多内置的上下文处理器。这些上下文处理器的作用如下：

django.template.context_processors.debug：增加一个debug和sql_queries变量。在模板中可以通过他来查看到一些数据库]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（38）-cookie和session]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119756</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119756</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:47:15 +0800</pubDate><description><![CDATA[cookie和session


cookie：在网站中，http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后，第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题，第一次登录后服务器返回一些数据（cookie）给浏览器，然后浏览器保存在本地，当该用户发送第二次请求的时候，就会自动的把上次请求存储的cookie数据自动的携带给服务器，服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限，不同的浏览器有不同的存储大小，但一般不超过]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（37）-文件上传]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119725</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119725</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:44:35 +0800</pubDate><description><![CDATA[文件上传：
文件上传是网站开发中非常常见的功能。这里详细讲述如何在Django中实现文件的上传功能。
前端HTML代码实现：

在前端中，我们需要填入一个form标签，然后在这个form标签中指定enctype="multipart/form-data"，不然就不能上传文件。
在form标签中添加一个input标签，然后指定input标签的name，以及type="file"。

以上两步的示例代码如下：
&lt;form action="" method="post" enctype="multipart]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（36）-ModelForm]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119705</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119705</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:43:57 +0800</pubDate><description><![CDATA[ModelForm：
大家在写表单的时候，会发现表单中的Field和模型中的Field基本上是一模一样的，而且表单中需要验证的数据，也就是我们模型中需要保存的。那么这时候我们就可以将模型中的字段和表单中的字段进行绑定。
比如现在有个Article的模型。示例代码如下：
from django.db import models
from django.core import validators
class Article(models.Model):
    title = models.CharField]]></description><category></category></item><item><title><![CDATA[最浅显易懂的Django系列教程（35）-用表单验证数据]]></title><link>https://blog.youkuaiyun.com/jspython/article/details/106119664</link><guid>https://blog.youkuaiyun.com/jspython/article/details/106119664</guid><author>jspython</author><pubDate>Thu, 14 May 2020 14:42:44 +0800</pubDate><description><![CDATA[用表单验证数据
常用的Field：
使用Field可以是对数据验证的第一步。你期望这个提交上来的数据是什么类型，那么就使用什么类型的Field。
CharField：
用来接收文本。
参数：

max_length：这个字段值的最大长度。
min_length：这个字段值的最小长度。
required：这个字段是否是必须的。默认是必须的。
error_messages：在某个条件验证失败的时候，给出错误信息。

EmailField：
用来接收邮件，会自动验证邮件是否合法。
错误信息的key：require]]></description><category></category></item></channel></rss>