You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Django REST Framework中集成pyejabberd实现Ejabberd用户注册并获取JID

Integrating Django REST Framework with Ejabberd for User Registration

Hey there! Let's walk through how to connect your Django DRF API with Ejabberd to handle user registration and generate JIDs, including details on pyejabberd and alternative tools you can use.

First: Is pyejabberd compatible with Django?

Short answer: Absolutely! pyejabberd is just a regular Python library that wraps Ejabberd's HTTP API—you don't need to add it to INSTALLED_APPS at all. That step was a misunderstanding; it's not a Django app, just a utility you can call directly from your Django code.

Step-by-Step pyejabberd Integration

1. Install the library

First, install it via pip:

pip install pyejabberd

2. Configure Ejabberd's HTTP API

Before you can call Ejabberd from Django, you need to enable its HTTP API and grant your Django server permission to use the user registration endpoint. Edit your ejabberd.yml file:

# Add this to the listen section to enable HTTP API
listen:
  - port: 5280
    module: ejabberd_http
    request_handlers:
      "/api": mod_http_api

# Set up permissions for your Django server's IP
api_permissions:
  "register_access":
    - who:
        - ip: "127.0.0.1/32"  # Replace with your Django server's public IP if needed
      what:
        - "register"  # Allow user registration via API

Restart Ejabberd after making these changes.

3. Use pyejabberd in your Django code

Create a helper function or service class to handle Ejabberd registration from your DRF views. Here's a simple example:

from pyejabberd import EjabberdAPIClient
from django.conf import settings

def create_ejabberd_user(username: str, password: str) -> tuple[str | None, str | None]:
    """Register a user in Ejabberd and return their JID or an error message."""
    try:
        client = EjabberdAPIClient(
            host=settings.EJABBERD_HOST,  # Add this to your Django settings
            port=settings.EJABBERD_API_PORT,
            username=settings.EJABBERD_ADMIN_USER,
            password=settings.EJABBERD_ADMIN_PASSWORD
        )
        
        response = client.register_user(
            username=username,
            host=settings.EJABBERD_DOMAIN,
            password=password
        )
        
        if response.get("result") == "ok":
            jid = f"{username}@{settings.EJABBERD_DOMAIN}"
            return jid, None
        else:
            return None, response.get("error", "Unknown error occurred")
    except Exception as e:
        return None, str(e)

You can call this function from your DRF serializer or view when a new Django user is created—just pass their username and password to generate their JID.

Alternative Libraries/Tools

If pyejabberd doesn't fit your needs, here are two solid alternatives:

1. Ejabberd XML-RPC

Ejabberd has native support for XML-RPC, which you can use directly with Python's built-in xmlrpc.client module (no extra libraries needed):

import xmlrpc.client
from django.conf import settings

def register_via_xmlrpc(username: str, password: str) -> tuple[str | None, str | None]:
    server = xmlrpc.client.ServerProxy(f"http://{settings.EJABBERD_HOST}:4560/RPC2")
    try:
        server.register_user(username, settings.EJABBERD_DOMAIN, password)
        return f"{username}@{settings.EJABBERD_DOMAIN}", None
    except xmlrpc.client.Fault as e:
        return None, e.faultString

Note: You'll need to enable mod_xmlrpc in your ejabberd.yml and set up the correct listen port for XML-RPC.

2. Ejabberd Command-Line Tool (ejabberdctl)

For simpler use cases, you can call Ejabberd's CLI tool directly from Django using subprocess:

import subprocess
from django.conf import settings

def register_via_cli(username: str, password: str) -> tuple[str | None, str | None]:
    try:
        subprocess.run(
            ["ejabberdctl", "register", username, settings.EJABBERD_DOMAIN, password],
            check=True,
            capture_output=True,
            text=True
        )
        return f"{username}@{settings.EJABBERD_DOMAIN}", None
    except subprocess.CalledProcessError as e:
        return None, e.stderr.strip()

This is less ideal for production (since it relies on system commands and permissions), but it works for testing or small-scale apps.

Final Notes

  • Always store Ejabberd credentials (admin user, password, domain) in your Django settings.py using environment variables (never hardcode them!).
  • Make sure your Django server can reach Ejabberd's API/XML-RPC port (check firewall rules if they're on separate servers).

内容的提问来源于stack exchange,提问作者sevenio

火山引擎 最新活动