Python Forum
How can I add files to GitLab with `python-gitlab`?
Thread Rating:
  • 2 Vote(s) - 3 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How can I add files to GitLab with `python-gitlab`?
#1
Using Django, I’d like to sync the files in the database with git repositories on my GitLab instance via python-gitlab.

My code:

import gitlab
import base64
import os
from .models import Meme
from django.conf import settings

class Sync:

    def sync () :
        gl = gitlab.Gitlab('<GitLab URL>', private_token='xxxxxxxxxxxxxx')
        for meme in Meme.objects.all():
            meme_title = meme.meme_title
            meme_file = str(meme.meme_file)

            root = settings.MEDIA_ROOT
            place = os.path.join(root, meme_file)

            # Create a new project on GitLab.
            project = gl.projects.create({'name': meme_title })

            data = {
                'branch': 'master',
                'commit_message': 'Automatic commit via sync.py.',
                'actions': [
                    {
                        # Binary files need to be base64 encoded
                        'action': 'create',
                        'file_path': place,
                        'content': base64.b64encode(open(place, "rb").read()),
                        'encoding': 'base64',
                    }
                ]
            }

            commit = project.commits.create(data)
I’m getting the following traceback:
Error:
Traceback (most recent call last): File "/Users/keno/memeweb/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner response = get_response(request) File "/Users/keno/memeweb/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response response = self.process_exception_by_middleware(e, request) File "/Users/keno/memeweb/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/keno/memeweb/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "/Users/keno/memeweb/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view return self.dispatch(request, *args, **kwargs) File "/Users/keno/memeweb/lib/python3.6/site-packages/rest_framework/views.py", line 483, in dispatch response = self.handle_exception(exc) File "/Users/keno/memeweb/lib/python3.6/site-packages/rest_framework/views.py", line 443, in handle_exception self.raise_uncaught_exception(exc) File "/Users/keno/memeweb/lib/python3.6/site-packages/rest_framework/views.py", line 480, in dispatch response = handler(request, *args, **kwargs) File "/Users/keno/memeweb/memetree/views.py", line 42, in post Sync.sync() File "/Users/keno/memeweb/memetree/sync.py", line 54, in sync commit = project.commits.create(data) File "/Users/keno/memeweb/lib/python3.6/site-packages/gitlab/exceptions.py", line 242, in wrapped_f return f(*args, **kwargs) File "/Users/keno/memeweb/lib/python3.6/site-packages/gitlab/mixins.py", line 204, in create **kwargs) File "/Users/keno/memeweb/lib/python3.6/site-packages/gitlab/__init__.py", line 589, in http_post post_data=post_data, files=files, **kwargs) File "/Users/keno/memeweb/lib/python3.6/site-packages/gitlab/__init__.py", line 463, in http_request prepped = self.session.prepare_request(req) File "/Users/keno/memeweb/lib/python3.6/site-packages/requests/sessions.py", line 441, in prepare_request hooks=merge_hooks(request.hooks, self.hooks), File "/Users/keno/memeweb/lib/python3.6/site-packages/requests/models.py", line 312, in prepare self.prepare_body(data, files, json) File "/Users/keno/memeweb/lib/python3.6/site-packages/requests/models.py", line 462, in prepare_body body = complexjson.dumps(json) File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 231, in dumps return _default_encoder.encode(obj) File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 180, in default o.__class__.__name__) TypeError: Object of type 'bytes' is not JSON serializable
What am I doing wrong? Why is type bytes not fitting?
Reply
#2
based on this example on line#29 you should use 'r' mode, not 'rb'
https://python-gitlab.readthedocs.io/en/...mmits.html
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#3
JSON format only supports Unicode strings.
you can decode to string(which is Unicode by default in Python 3),be using decode() or decode('ascii') as Base64 encodes bytes to ASCII-only bytes.
Error:
>>> import base64
>>> import json
>>> 
>>> place = base64.b64encode(open('foo.txt', "rb").read())
>>> place
b'aGVsbG8gd29ybGQNCg0K'
>>> type(place)
<class 'bytes'>

>>> d = {}
>>> d['name'] = place
>>> json.dumps(d)
Traceback (most recent call last):
  File "<string>", line 428, in runcode
  File "<interactive input>", line 1, in <module>
  File "C:\Python37\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Python37\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Python37\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Python37\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable
Fix:
>>> import base64
>>> import json
>>> 
>>> place = base64.b64encode(open('foo.txt', "rb").read()).decode() # Or decode('ascii')
>>> type(place)
<class 'str'>
>>> d = {}
>>> d['name'] = place
>>> json.dumps(d)
'{"name": "aGVsbG8gd29ybGQNCg0K"}'
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020