簡體   English   中英

如何使用`python-gitlab`將文件添加到GitLab?

[英]How can I add files to GitLab with `python-gitlab`?

使用 Django,我想通過python-gitlab將數據庫中的文件與我的 GitLab 實例上的 git 存儲庫python-gitlab

在這里你可以找到我的 Python 代碼:

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)

我得到以下回溯:

    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

我究竟做錯了什么? 為什么類型bytes不合適?

問題是您在data字典中傳遞了無效數據。

具體來說,Python 3 上的base64.b64encode() 返回一個 bytes 對象,然后嘗試將其轉換為 JSON 以進行傳輸的 JSON 編碼器無法處理該對象。 您可以將該字節對象轉換為字符串,如下所示:

 'content': base64.b64encode(open(place, "rb").read()).decode("utf-8"),
import gitlab
import os

def uploadFile(auth_token,project_id,file_path,branch,email,name):
    try:
        gl = gitlab.Gitlab('https://gitlab.com', private_token=auth_token)
        gl.auth()
        with open(file_path, 'r') as my_file:
            file_content = my_file.read()
        file_name = os.path.basename(file_path)
        project = gl.projects.get(project_id)
        f = project.files.create({'file_path': file_name,
                                  'branch': branch,
                                  'content': file_content,
                                  'author_email': email,
                                  'author_name': name,
                                  'commit_message': 'Upload'})
        return(1)
    except():
        return(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM