Skip to main content

I am looking for a good/best-practices example python script the can check for a token for the user, if not valid will request one and then execute a set workspace.

 

Anyone have anything they are willing to share?

Unless you need to send the token several times per second, I would simply request a new, short-lived token for every request. They're very quick and easy to get.


Unless you need to send the token several times per second, I would simply request a new, short-lived token for every request. They're very quick and easy to get.

Ok, I can get that; still having a hard time getting a good script to work that does it; getting a 403 constantly.

 

Trying to write something that I can encapsulate in ArcGIS Server

 

def do_getToken():
    """Call to FME Server to get a token for the GUEST user"""
    try:
        url = '{0}/fmerest/v3/tokens'.format(SERVER_URL)
 
        tokenParams = {
            "restricted": "true",
            "name": "guestToken",
            "description": "guest token",
            "expirationTimeout": 3600,
            "user": "fmeadmin",
            "type": "SYSTEM",
            "enabled": "true"
        }
 
        # Request constructor expects bytes, so we need to encode the string
        body = json.dumps(tokenParams).encode('utf-8')
 
        headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
 
        # This will use POST, since we are including data
        req = urllib.request.Request(url, body, headers)
 
        r = urllib.request.urlopen(req, context=context)
 
        print('Request status: ' + str(r.status))
 
        resp = r.read()
        resp = resp.decode('utf-8')
        resp = json.loads(resp)
 
        TOKEN = resp
 
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
    except Exception as e:
        print(e.argsr0])
# End do_getToken function

But not a lot of examples for calling FME from python.


Ok, I can get that; still having a hard time getting a good script to work that does it; getting a 403 constantly.

 

Trying to write something that I can encapsulate in ArcGIS Server

 

def do_getToken():
    """Call to FME Server to get a token for the GUEST user"""
    try:
        url = '{0}/fmerest/v3/tokens'.format(SERVER_URL)
 
        tokenParams = {
            "restricted": "true",
            "name": "guestToken",
            "description": "guest token",
            "expirationTimeout": 3600,
            "user": "fmeadmin",
            "type": "SYSTEM",
            "enabled": "true"
        }
 
        # Request constructor expects bytes, so we need to encode the string
        body = json.dumps(tokenParams).encode('utf-8')
 
        headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
 
        # This will use POST, since we are including data
        req = urllib.request.Request(url, body, headers)
 
        r = urllib.request.urlopen(req, context=context)
 
        print('Request status: ' + str(r.status))
 
        resp = r.read()
        resp = resp.decode('utf-8')
        resp = json.loads(resp)
 
        TOKEN = resp
 
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
    except Exception as e:
        print(e.argsÂ0])
# End do_getToken function

But not a lot of examples for calling FME from python.

I would recommend using the requests library rather than urllib, it is so much easier to work with. I suspect that requests is even installed with some ArcGIS Python interpreters by default. Here's some code that requests a token from FME Server, using the requests module:

def get_token(self):
    """
    Requests a token from FME Server using the username/password
    :return: Security token
    """
    url = '%s/fmetoken/service/generate' % (self.base_url)
    payload = {
        'user': self.username,
        'password': self.password,
        'expiration': str(self.token_ttl_secs),
        'timeframe': 'second'
    }
    response = requests.post(url, data=payload)
    response.raise_for_status()
    self.token = response.text
    return self.token

Granted, it uses the "old" token API, but it should be easy to adapt.

I hope the instance variables are self-explanatory, if not, let me know.


Ok, I can get that; still having a hard time getting a good script to work that does it; getting a 403 constantly.

 

Trying to write something that I can encapsulate in ArcGIS Server

 

def do_getToken():
    """Call to FME Server to get a token for the GUEST user"""
    try:
        url = '{0}/fmerest/v3/tokens'.format(SERVER_URL)
 
        tokenParams = {
            "restricted": "true",
            "name": "guestToken",
            "description": "guest token",
            "expirationTimeout": 3600,
            "user": "fmeadmin",
            "type": "SYSTEM",
            "enabled": "true"
        }
 
        # Request constructor expects bytes, so we need to encode the string
        body = json.dumps(tokenParams).encode('utf-8')
 
        headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
 
        # This will use POST, since we are including data
        req = urllib.request.Request(url, body, headers)
 
        r = urllib.request.urlopen(req, context=context)
 
        print('Request status: ' + str(r.status))
 
        resp = r.read()
        resp = resp.decode('utf-8')
        resp = json.loads(resp)
 
        TOKEN = resp
 
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
    except Exception as e:
        print(e.argsÂ0])
# End do_getToken function

But not a lot of examples for calling FME from python.

Awesome; and this gave me enough of a jumpstart to fix the rest of my class to get my job execution method in place.

 

Thank you so much!


Reply