私は 2 つの Web2Py アプリケーションを持っています。それらをProviderとReceiverと呼びましょう。Providerは基本的な認証機能を提供し、Receiverはそれを使用してログインします。ユーザーはProviderのローカル データベースに作成されており、Receiverはそれらのユーザー資格情報を使用して正常にログインしています。しかし、コントローラーに RESTful メソッドがある場合、jQuery-Ajax 呼び出しは、同じユーザー名を使用して同じブラウザー セッションから手動でプロバイダーにログインした場合にのみ機能します。それを行わずにReceiverからのみログインすると、正常にログインしたと表示されますが、Ajax GET 呼び出しは正常に実行されません。レシーバーにログインするとあるユーザー名を使用してProviderに、別のユーザー名を使用して Provider に、Ajax GET はProviderにログインしているユーザーの情報を取得します。これをスクリプトとして Receiver に入れindex.html
ました:
var gBaseUrl="http://127.0.0.1:8000/Provider/sites/";
$(document).ready(function(){
$.ajax({
type: "GET",
async: true,
url: gBaseUrl+"get_username",
dataType: "text",
success: function(data){
$('#ContentView').append('<p> succeeded '+data+'</p>');
}
failure: function(data){
$('#ContentView').append('<p> failed '+data+'</p>');
}
});
});
Providerにローカルでログインしない場合、ContentView には何も追加されません。Providerは次のdb.py
ようになります。
## configure auth policy
auth.settings.registration_requires_verification = True
auth.settings.registration_requires_approval = True
auth.settings.reset_password_requires_verification = True
auth.settings.allow_basic_login = True
auth.settings.controller = 'default'
auth.settings.hmac_key = None
auth.settings.mailer = None
auth.settings.login_after_registration = False
基本認証を実現するために、Providerには次のdefault.py
ものがあります。
def basic_auth():
"""
checks if the user is logged in and returns True/False.
if so user is in auth.user as well as in session.auth.user
"""
auth.basic()
if auth.user:
print("login success!")
print(auth.user.username, " is logging in!")
session.forget()
return True
else:
print("login failed!")
return False
そして、ユーザー名を返すために、Providerのsite
コントローラーで、次のようにします。
@request.restful()
@auth.requires_login()
def get_username():
def GET():
return str(auth.user.username)
return locals()
ContentView はdiv
、私が持っている空に他なりませんindex.html
。
また、次のrequires
デコレータの実装を少し変更しましたgluon/tools.py
。
if current.request.ajax:
raise HTTP(401)
...
elif self.settings.allow_basic_login_only or \
basic_accepted or current.request.is_restful:
raise HTTP(401, **{'WWW-Authenticate': 'Basic realm="My Realm"'})
...