Python 关键语句
python cheatsheet
废话不多说,先上图。
这是一个法国人写的python的小抄,确实总结和整理的非常好,python的基本语法在这个上面基本上都有了,同时这个作者在网站上分享了非常多的相关内容。唯一美中不足的是法语的。 不过可以反映成英文慢慢的看
https://perso.limsi.fr/pointal/python:memento
访问之后看这个网站有很多的内容
Token超时机制,Token刷新怎么做
参考页面:
http://txjdsk.iteye.com/blog/1861210
https://blog.csdn.net/educast/article/details/69230054
https://www.jb51.net/article/84604.htm
https://blog.csdn.net/WongRu1/article/details/80953314
https://www.cnblogs.com/dong-xu/p/6075705.html
解决方法
oauth的token超时之后,用户登陆的session其实还在,只是调用ajax的时候由于token超时而无法获取相关的数据。
解决方法是:
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
xhr.setRequestHeader('Authorization', 'Bearer ' + $.cookie('access_token'));
},
error: function (xhr,textStatus,errorThrown){
if (xhr.status == 401){
window.location.href = "/logout/"
}
}
});
网上比较多的方式说是使用dataFilter来绑定,这种方法不是太适合当前模式的OAuth2。由于dataFilter需要ajax返回成功的时候才FIlter他的data数据,但是这种情况下的用户无权限实际上是返回的error。所以需要通过error来进行绑定。
待完成
这里的token超时之后是直接跳转到logout,然后跳转到login待用户登陆。实际上还可以使用token refresh,这种后面可以研究一下怎么做。
django 集成oauth2
curl -X POST -d "grant_type=password&username=pengjunjie&password=stella" -u"G65f6XQQ1FkqEm5LBMW4PEleBqQxfHdq9WPKjjaA:Pdf9nfta886KT2wGV9hJyN4tn37pSEGGHkXLpqcLYPvu8vzQkLAPBLbNXNyKy3MBHQCQT3vYA9Wniyg4bnFBqrqHJAChshz4WNQyFHOmByu4NA8S6Au6PgjUdWmbFrce" http://localhost:8000/token/
使用 Django OAuth Toolkit 工具包
注意:当前我使用的django 1.11版本,python3.6版本。如果直接使用pip安装django-oauth-toolkit
,会默认去下载django2.0版本,所以这里我选择安装了django-oauth-toolkit==1.1.2
版本,在这个版本下会默认使用本地的django1.11
版本
官网上的操作手册有两个,一个是直接使用的Tutorias,另外一个是django rest framework
,最好还是去看django rest framwork的版本,这样结合得更紧密一些。
使用了oauth toolkit,配置完成后,其实对整个django的侵入不算大,依然可以使用request.user来判断用户,这样节省了一个比较大的时间来写公共方法。这样也解决了如果需要绑定用户信息的话,如果不带token就没法使用postman的情况,方便用户长期使用。
接口情况
获取token
curl -X POST -d "grant_type=password&username=pengjunjie&password=stella" -u"l3iNxSydVcHvTeKS9PZJgp2xKgWisaPS60STiWtq:dkyyvEo6rBn2HJRfQThC8Bi5uHVgD2dw8D9r2V5ZsXD8Zrqd0jbhaTXfwgFRZsDZnnLkw6uKra4lrkj6YmeoW8noWRFohMaVXlrADh5wpnNcRSru7prvIZRNwDMJhKMw" http://localhost:8000/token/
在postman上配置如下
查看接口情况
^o/ ^authorize/$ [name='authorize']
^o/ ^token/$ [name='token']
^o/ ^revoke_token/$ [name='revoke-token']
^o/ ^introspect/$ [name='introspect']
^o/ ^applications/$ [name='list']
^o/ ^applications/register/$ [name='register']
^o/ ^applications/(?P<pk>[\w-]+)/$ [name='detail']
^o/ ^applications/(?P<pk>[\w-]+)/delete/$ [name='delete']
^o/ ^applications/(?P<pk>[\w-]+)/update/$ [name='update']
^o/ ^authorized_tokens/$ [name='authorized-token-list']
^o/ ^authorized_tokens/(?P<pk>[\w-]+)/delete/$ [name='authorized-token-delete']
上面就是自带的所有接口情况
django manytomany 保存和更新
Django中的模型类维护了一对多和多对多的关系。在保存这些关联对象时,只要按照属性字段为其设置相对应的管理对象,然后调用save()方法即可。比如下面代码中,一个Blog对应多个Entry对象;多个Entry对应多个Auther对象:
class Blog(models.Model):
name=models.CharField(max_length=100)
tagline=models.TextField()
def unicode(self):
return self.name
class Author(models.Model):
name=models.CharField(max_length=50)
email=models.EmailField()
def unicode(self):
return self.name
class Entry(models.Model):
blog=models.ForeignKey(Blog)
headline=models.CharField(max_length=255)
body_text=models.TextField()
pub_date=models.DateTimeField()
mod_date=models.DateTimeField()
authors=models.ManyToManyField(Author)
n_comments=models.IntegerField()
n_pingbacks=models.IntegerField()
rating=models.IntegerField()
def __unicode__(self):
return self.headline
现在我们开始保存Entry对象,先来看如何保存一对多关联对象:
$ python manage.py shell
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type “help”, “copyright”, “credits” or “license” for more information.
(InteractiveConsole)
from myapp.models import *
import datetime
e1=Entry(headline=‘Hello’,body_text='Hello World’,pub_date=datetime.datetime
.now(),mod_date=datetime.datetime.now(),n_comments=1,n_pingbacks=1,rating=1) # 创建一个Entry对象
b=Blog.objects.get(pk=1) # 取得一个已经存在的Blog对象
e1.blog=b #设置这个Entry属于取得的Blog
e1.save() # 保存这个Entry对象
由于Blog和Entry之间是一对多关系,所以这里我们保存这个Entry的Blog属性时,只要将它的blog字段赋值即可。
下面再来看看如何保存多对多关系:eric=Author.objects.create(name='Eric’,email='test@test.cn’) # 用create方法创建一个Author对象
e1.authors.add(eric) #把这个Author加入到Entry中
e1.save() #保存这个Entry对象
保存多对多关系时,需要通过create方法创建一个多对多管理的对象,这里是Author。由于一个Entry有多个Author,所以我们这里用到了add()方法,来把这个Author添加到Entry中。我们在使用create()、get()方法时都是使用了相应对象的objects这个对象。这里的objects是对象的管理器,它是Django为每个模型对象提供的默认管理器对象,需要注意的是,objects对象只能是类级别的对象,而不是实力级别的对象。也就是说如果你构造了一个模型对象的实例,是不能通过实例来获取objects的,如果这样使用会抛出异常。
CSRF的小技巧
django默认开启了CSRF验证,在form的提交或者rest framework里面的POST的请求的时候,会开启CSRF的验证。
如果用户没有登录的情况下,可以不需要使用csrf就调用,但是如果有用户信息的时候,会经过CSRF,在调用请求的时候可以看到相应的返回。
这一篇blog讲的比较清楚 http://www.liujiangblog.com/course/django/179
如果在javascript的代码中修改,需要增加
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// 这些HTTP方法不要求CSRF包含
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
Copyright © 2020 鄂ICP备16010598号-1