我有一个django项目,使用django-rest-framework来创建api.
想要使用令牌基础认证系统,因此api调用(put,post,delete)只会为授权用户执行.
我安装了'rest_framework.authtoken'并为每个用户创建了令牌.
所以,现在从django.contrib.auth.backends身份验证,它返回用户,auth_token作为属性.(成功时).
现在我的问题是如何将带有post请求的令牌发送到我的api和api端如何验证令牌是否有效并且属于正确的用户?
app rest_framework.authtoken中是否有任何方法可以验证给定用户及其令牌?没发现这个非常有用!
更新(我做的更改):在我的settings.py中添加了这个:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
)
}
Run Code Online (Sandbox Code Playgroud)
还在我的标题中发送令牌,但它仍然无法正常工作:
if new_form.is_valid:
payload= {"createNewUser":
{ "users": request.POST["newusers"],
"email": request.POST["newemail"]
}
}
headers = {'content-type' : 'application/json',
'Authorization': 'Token 6b929e47f278068fe6ac8235cda09707a3aa7ba1'}
r = requests.post('http://localhost:8000/api/v1.0/user_list',
data=json.dumps(payload),
headers=headers, verify=False)
Run Code Online (Sandbox Code Playgroud) 想知道是否有人可以解释openssl如何在python2.7中工作.我不确定python是否有自己的openssl或从本地机器/环境中获取它?
让我解释一下:(如果我在Python中这样做)
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8x 10 May 2012'
Run Code Online (Sandbox Code Playgroud)
(在终端)
$ openssl version
OpenSSL 0.9.8x 10 May 2012
$ which openssl
/usr/bin/openssl
Run Code Online (Sandbox Code Playgroud)
现在我更新了openssl(已下载.)
$ cd openssl-1.0.1c
$ ./Configure darwin64-x86_64-cc --prefix=/usr --openssldir=/opt/local/etc/openssl shared
$ make
$ sudo make install
Run Code Online (Sandbox Code Playgroud)
这创建了单独的导演(如指定的那样),因此我将其复制到旧路径中
cp -f /usr/local/ssl/bin/openssl /usr/bin/openssl
Run Code Online (Sandbox Code Playgroud)
现在在终端openssl版本已经更新但不是来自python!
$ openssl version
OpenSSL 1.0.1c 10 May 2012
Run Code Online (Sandbox Code Playgroud)
我注意到.dylib仍然指向旧版本,我该如何更改?
$ ls -l /usr/lib/*ssl*
-rwxr-xr-x 1 root wheel 411680 Jul 17 2012 /usr/lib/libssl.0.9.7.dylib
-rwxr-xr-x 1 root wheel 602800 May 24 03:43 /usr/lib/libssl.0.9.8.dylib
-rwxr-xr-x 1 …Run Code Online (Sandbox Code Playgroud) 注意:这个代码在Ubuntu上运行正常,但在mac上运行不正常,而不是在本地更改mac/python设置我正在尝试对代码进行更改,以便它可以在任何地方工作.
import ssl
import httplib
httplib.HTTPConnection(server, port, timeout)
Run Code Online (Sandbox Code Playgroud)
但它会引发错误:
[Errno 1] _ssl.c:503:错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议
现在代码不使用urllib.request而是使用httplib
我想更改代码,因此它将SSLv3作为默认协议,如下所示:
ssl.SSLContext(ssl.PROTOCOL_SSLv3)
Run Code Online (Sandbox Code Playgroud)
我环顾四周,找到了一些链接,但没有任何工作!
我正在使用多种方法通过不同的 django 查询集从数据库获取数据,但我想知道每个查询集的运行时,如果可能的话,还有更好的方法(也许可以在恒定时间内获取数据!!)
qs = MyModel.objects.order_by('-time')
qs = qs.filter(blah = blah)
Run Code Online (Sandbox Code Playgroud)
要获得第一个条目,我正在这样做:
entry = list(qs[:1])
first_entry = entry[0]
Run Code Online (Sandbox Code Playgroud)
或获得第 10 个也是最后一个条目:
entry = list(qs)
some_entry = entry[9]
last_entry = entry[-1]
Run Code Online (Sandbox Code Playgroud)
但我相信这将花费 O(n) 时间,无论如何可以在恒定时间内获得第 n 项?我不想使用 get() 因为我不知道条目的 id 或其他值(已排序),而只知道位置。
我也可以使用注释,但这也需要 O(n) 运行时。
MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0]
Run Code Online (Sandbox Code Playgroud)
我知道该职位只需要在恒定时间内输入?
html 表单中的文本字段有默认值,但我想显示占位符而不是默认值。有任何想法吗?
更新django从1.4到1.5.1现在抛出这个:
弃用警告:不推荐使用'setup_environ'功能,您可能需要更新'manage.py'; 请参阅Django 1.4发行说明(https://docs.djangoproject.com/en/dev/releases/1.4/).
首先,我已经在v1.4了,为什么它现在显示呢?好..
manage.py已经有了这个:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
Run Code Online (Sandbox Code Playgroud)
但很少有应用程序使用此:
from django.core.management import setup_environ
from mysite import settings
setup_environ(settings)
Run Code Online (Sandbox Code Playgroud)
如果我评论上面的代码,它会抛出一个错误:
django.core.exceptions.ImproperlyConfigured:请求设置AUTH_USER_MODEL,但未配置设置.您必须在访问设置之前定义环境变量DJANGO_SETTINGS_MODULE或调用settings.configure().
所以,我调用'settings.configure'并用以下代码替换上面的代码:
from django.conf import settings
from mysite import settings as mysettings
settings.configure(mysettings, DEBUG=True)
Run Code Online (Sandbox Code Playgroud)
但它仍然是错误的!
AttributeError:'module'对象没有属性'LOGGING_CONFIG'
基本上'setup_environ'正在运行,但是在DeprecationWarning中,我怎么能得到它呢?显然,我发布了1.4版的发布说明,但无法弄清楚这一点.
[更新]:完整代码
我总是对 pyhton 的静态方法感到困惑,但根据这个(最后一个答案),它应该可以工作!
得到错误:
AttributeError: 类 MyConnection 没有属性“myuser”
class MyConnection:
def __init__(self, hostname, port, user, password):
myhostname = hostname
myport = port
myuser = user
mypassword = password
isisessid = None
@staticmethod
def connect():
my_session = MyConnection()
headers = {'content-type': 'application/json'}
headers['Authorization'] = 'Basic ' + string.strip(
base64.encodestring(MyConnection.myuser + ':' + MyConnection.mypassword))
body = json.dumps({'username': MyConnection.myuser, 'password': MyConnection.mypassword,
'services': ['platform', 'namespace']})
uri = '/session/1/session'
connection = httplib.HTTPSConnection(MyConnection.myhostname, MyConnection.myport)
connection.connect()
try:
connection.request('POST', uri, body, headers)
response = connection.getresponse() …Run Code Online (Sandbox Code Playgroud) python ×6
django ×3
ssl ×2
big-o ×1
django-1.5 ×1
forms ×1
html ×1
httplib ×1
javascript ×1
oop ×1
openssl ×1
python-2.7 ×1
runtime ×1
updates ×1