ラベル Bluemix の投稿を表示しています。 すべての投稿を表示
ラベル Bluemix の投稿を表示しています。 すべての投稿を表示

2018年9月21日金曜日

IBM Cloud上でCloudantを使ってみた!(後編)

前回、ローカルからCloudantデータベースにアクセスしました。
今回は、WebAPIでCloudantを使ってみます。


@app.route('/api/adduser', methods = ['POST'])
def AddUser():

    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])

        client = Cloudant('d.....', 'a.....', url='https://d.....')
        client.connect()

        my_database = client['users']

        if user not in my_database:
            my_database.create_document({'_id' : user})

        client.disconnect()

        return jsonify(status = 'success')
    else:
        return jsonify(status = 'error')


{"user":"Taro"}というデータを2回送信したところ、1回目は登録され、2回目にエラーが発生しました。


requests.exceptions.HTTPError: 409 Client Error: Conflict conflict Document update conflict. for url:https://.....


デバッグ用コードを入れ、いろいろ試してみたところ、どうも存在チェックが正常に動作していないようです。
存在チェック前に全データを出力する処理を入れるとなぜだかうまくいきました。


@app.route('/api/adduser', methods = ['POST'])
def AddUser():

    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])

        client = Cloudant('d.....', 'a.....', url='https://d.....')
        client.connect()

        my_database = client['users']

        #########################################
        # usersの全データを出力
        for doc in my_database:
            print(doc)
        #########################################

        if user not in my_database:
            my_database.create_document({'_id' : user})

        client.disconnect()

        return jsonify(status = 'success')
    else:
        return jsonify(status = 'error')


使用したpython-cloudantのバージョンは2.3.1でした。
どうやらpython-cloudantのバグのようで、少なくとも2.9.0ではこの問題は修正されていました。

またいつか、どこかで。

2018年9月14日金曜日

IBM Cloud上でCloudantを使ってみた!(中編)

前回はCloudantサービスとデータベースを作成しました。
今回は、ローカルからデータを登録・取得します。

Cloudantデータベースにアクセスするには、ライブラリをインストールする必要があります。
私の環境はWindowsですので、下記のコマンドを実行してインストールしました。


> py -m pip install cloudant



接続するには、ユーザー名、パスワード、URLが必要です。
「資格情報の表示」から確認しておきましょう。

















python-cloudantのドキュメントページには、データベースオープン、ドキュメント作成などのソースが載っています。
それらを参考に、「引数で指定されたユーザーが存在しなければ登録する」というコードを作成しました。


from cloudant.client import Cloudant
import sys

user = sys.argv[1]

client = Cloudant('d.....', 'a.....', url = 'https://d.....')
client.connect()

database = client['users']
if user not in database:
    database.create_document({'_id' : user})

for document in database:
    print(document)

client.disconnect()


実行してみます。


> py cloudantsample.py Taro
{'_id': 'Taro', '_rev': '1-.....'}

> py cloudantsample.py Hanako
{'_id': 'Hanako', '_rev': '1-.....'}
{'_id': 'Taro', '_rev': '1-.....'}

> py cloudantsample.py Taro
{'_id': 'Hanako', '_rev': '1-.....'}
{'_id': 'Taro', '_rev': '1-.....'}



ダッシュボードで確認すると、データが追加されています。











次回はクラウド上でデータ登録・取得してみます。

またいつか、どこかで。

2018年9月7日金曜日

IBM Cloud上でCloudantを使ってみた!(前編)

IBM Cloud上でCloudantを使用して、データを登録・取得してみました。
その方法をメモ。

まず、Cloudantサービスを作成します。
「データベース」の中から「Cloudant」を選択し、サービスを作成します。
サービス作成後、アプリケーションに接続しておきます。

次に、データベースを作成します。
Cloudantのダッシュボードを開きます。

データベース名を入力します。
今回は「users」というデータベースを作成します。














データベースが作成されました。














データの登録・取得は次回。

またいつか、どこかで。

2018年7月20日金曜日

IBM Cloud上でFlaskを使用してWebAPIを作る(後編)

前回、JSONデータをやり取りするWeb APIを作成しましたが、{"user":"太郎"}のように日本語を指定するとエラーが発生します。
ログを確認すると、


user = str(request.json['user'])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)


というエラーが出力されていました。

ググってみると「str文字列」だの「unicode文字列」だの・・・
ん?それってPython2の話ですよね?

もしやと思い、Pythonのバージョンを出力して確認してみると、やはりPython2.x系でした。


import sys
print('{}.{}.{}'.format(sys.version_info.major, sys.version_info.minor, sys.version_info.micro))


> 2.7.13


runtime.txtというファイルを新しく作成し、そこに

python-3.6.2

と記述してバージョンアップすると、エラーなく日本語も扱えるようになりました。

またいつか、どこかで。

2018年7月13日金曜日

IBM Cloud上でFlaskを使用してWebAPIを作る(前編)

IBM Cloud上でFlaskを使用し、JSONデータをやり取りするWeb APIを作成しています。
その方法をメモ。

Starter Kitsの中から「Python Flask」を選択し、アプリケーションを作成します。


























作成したアプリのソースをダウンロードします。

PythonもFlaskも未経験ですが、いろいろ調べながら下記のようなコードを作成しました。
受け取ったデータを結果とともにそのまま返すだけです。


from flask import Flask, jsonify, request

@app.route('/api/sample', methods = ['POST'])
def Sample():
    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])
        return jsonify({'status':'success', 'user':user})
    else:
        return jsonify({'status':'error'})


{"user":"Taro"}というデータを送信したところ、内部エラーが発生しました。

FlaskのAPIドキュメントの「is_json」の項には「New in version 0.11.」と記載されています。
requirements.txtは「Flask==0.10.1」と記載されており、どうやらFlaskのバージョンが古いことが原因のようです。

「Flask==1.0.2」と書き換え、現時点の最新版にバージョンアップすると、{"status":"success","user":"Taro"}という結果が返ってくるようになりました。

またいつか、どこかで。

2017年5月9日火曜日

ASP.NET Core WebアプリをBluemixにデプロイしてみた!

「Bluemix」って知ってますか?

アプリケーションを開発・実行する、IBMのクラウド・プラットフォームで、Java、Node.js、PHP、Python、Rubyなど
さまざまな言語で開発することができます。

今回は、Visual Studio 2017で作成したASP.NET Coreアプリを、Bluemixにデプロイしてみます。

ASP.NET Core Webアプリの作成


Visual Studio 2017でASP.NET Core Webアプリを作成します。

まず、「ASP.NET Core Web アプリケーション(.NET Core)」を選択し、プロジェクトを作成します。


























「Web API」を選択します。


これでプロジェクトが作成されました。
Getメソッドはデフォルトで文字列のコレクションを返すように実装されています。
デバッグ開始するとJSONデータのダウンロードとなってしまうのが煩わしいため、下記のように変更しました。
 
[HttpGet]
public string Get()
{
    return "value";
}


Bluemixへデプロイ


Bluemix上にデプロイします。


> cf push <アプリ名>


すると、アップロード完了後、下記のようなログが延々と表示されます。
どうやらアプリケーションの起動に失敗しているようです。


Uploading complete
Destroying container
Successfully destroyed container

0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
(ずっと続く)


ログを確認してみます。


> cf logs <アプリ名> --recent


ヘルスチェックに失敗しているようです。


2017-05-09T16:23:50.19+0900 [APP/0] OUT Now listening on: http://localhost:5000
2017-05-09T16:23:50.19+0900 [APP/0] OUT Application started. Press Ctrl+C to shut down.
2017-05-09T16:24:50.70+0900 [CELL/0] ERR Timed out after 1m0s: health check never passed.


仕方がないので、ヘルスチェックを無効にしてデプロイしてみます。


> cf push <アプリ名> -u none


デプロイに成功し、アプリケーションは正常に開始しましたが、アプリケーションのURLにアクセスするとエラーが発生しました。

 
502 Bad Gateway: Registered endpoint failed to handle the request.



Bluemixのスタートガイドに載っているGitHub上のサンプルアプリと見比べ、いろいろ試してみたところ、Mainメソッド内のホスト生成方法を変更すればよいことが分かりました。

まず、「Microsoft.Extensions.Configuration.CommandLine」をインストールします。






















そして、Mainメソッドを下記のように変更します。
これでデプロイすればOKです。
  
public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .AddCommandLine(args)
        .Build();
 
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseConfiguration(config)
        .UseStartup<Startup>()
        .Build();
 
    host.Run();
}
 

(Bluemixへのデプロイとは直接関係ありませんが、この変更を行うとVisual Studio上でデバッグを開始して起動しなくなってしまいました。プロジェクト設定の「起動URL」に設定されている「api/values」を、絶対URLに変更すると起動するようになります。)






















またいつか、どこかで。