Metadata-Version: 2.4
Name: valar
Version: 2.0.4
Summary: valar for morghulis
Home-page: https://gitee.com/vmworkspace/valar_engine.git
Author: LYP
Author-email: liuyinpeng@buaa.edu.cn
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: Django~=4.2.20
Requires-Dist: django-cors-headers==4.2.0
Requires-Dist: asgiref~=3.9.1
Requires-Dist: channels==3.0.3
Requires-Dist: PyJWT~=2.10.1
Requires-Dist: PyMySQL~=1.1.2
Requires-Dist: minio==7.2.2
Requires-Dist: urllib3~=2.5.0
Dynamic: author
Dynamic: author-email
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license-file
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

valar for morghulis

# 1. installation

- you need to install valar in a django project

```shell
pip install valar
```

# 2. root app

- you only need 3 files in your root app
    - settings.py
    - asgi.py
    - urls.py
    - \_\_init\_\_.py

## settings.py

```python

from pathlib import Path

""" Compulsory settings """
DEBUG = True
BASE_DIR = Path(__file__).resolve().parent.parent
BASE_APP = str(BASE_DIR.name)
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^'

""" Minimized compulsory settings """

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

INSTALLED_APPS = [
    'django.contrib.sessions',
    "corsheaders",
    'channels',
    'valar.apps.ValarConfig',
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'valar.system.middleware.ValarMiddleware'
]

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer"
    }
}

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
ROOT_URLCONF = "%s.urls" % BASE_APP
ASGI_APPLICATION = "%s.asgi.application" % BASE_APP

""" Optional settings """

ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_AGE = 60 * 60
FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100

""" Valar Options """

VALAR_HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
VALAR_MINIO_URL = "s3://admin:__password__@___host__:___port___"

""" Email Options """

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.____.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = "______@____.com"
EMAIL_HOST_PASSWORD = '______'

```

## __init__.py (when using MySQL)

```python
import pymysql

pymysql.install_as_MySQLdb()

```

## asgi.py

```python
import os
from pathlib import Path
from typing import cast, Callable, Any

from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from django.urls import re_path

from valar.system.socket.consumer import ValarConsumer

asgi_router_list = [
    re_path(
        r'(?P<client>\w+)/$',
        cast(Callable[..., Any], ValarConsumer.as_asgi())
    ),
]

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % Path(__file__).resolve().parent.parent.name)
application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': URLRouter(cast(Any, asgi_router_list))
})

```

## urls.py

```python
urlpatterns = [
]

channel_mapping = {
}

```

- go to section 4 to see how to register channel handlers (a Vue - Django async communication tool) in urls.

# 3. migrate

- no need to makemigrations and migrate for valar, valar will auto migration

# 4. how to register a channel handler for Morghulis async methods

## 4.1 create a handler

```python

```

### 4.2 create a dict (e.g. using the name 'channel_mapping') to save your handler

- I'd like to put it in the root urls.py, you can put it anywhere

```python

```

## 4.3 register the channel_mapping in the settings.py

```python

```

### 4.4 you can copy the following codes to your urls.py

```python


```

# 5. create an orm model extends the AbstractUser class, enable the authentication of Valar

```pycon

class User(AbstractUser):
    """
        any fields you want
    """
    description = models.TextField(null=True, verbose_name='备注')

    class Meta:
        verbose_name = 'User'

```
