كيف نرفع مشروع على هيريكو (vue+django)

هات ال configuration كي نعرف السبب

2 Likes

شو يعني ؟

1 Like

يعني ال settings في جانقو… هل غيرتها لتستعمل postgres ؟

1 Like
"""
Django settings for api project.

Generated by 'django-admin startproject' using Django 2.2.5.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '9*a0#[email protected]!#[email protected]*-vwdn7rttmrl3g3wt_r5)$5!!r0+'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ["*"]


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders', #CORS
    'rest_framework',  #rest
    'rest_framework.authtoken', #acces token
    'users.apps.UsersConfig',  #app users
    'articles.apps.ArticlesConfig',   #app articles
    
]

AUTH_USER_MODEL = 'users.User' # CustomUser
########## acces token && permissions
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', )
}

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  #CORS
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True #CORS

CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    # TODO - set this properly for production
    'http://localhost:8080',
    'http://127.0.0.1:8000',
)

ROOT_URLCONF = 'api.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'api.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

APPEND_SLASH=False  # example /api/users/checkusername(/)

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'


1 Like

شوف المقال اللي أرسلته لك… لانه هناك العديد من التعديلات كي يعمل تطبيقك في هيروكو.

أو تفضل هذا الريبو ممكن يساعدك

2 Likes

عم جرب اطبق المقال بخبرك بالتطورات

2 Likes

مشي الحال تم رفع مشروع الdjango
سأبدأ بتجهيز ال vue
لكن كل منهما سيعمل على دومين مستقل في هذه الحالة

1 Like

الان استطعت أن ارفع كل تطبيق على دومين
https://sohep-alslamat.herokuapp.com/ هنا vue
https://vuango-api.herokuapp.com/api/ هنا api django
الان اريد أن ارفع كلاهما على نفس الموقع لكن لكل منهما بورت مختلف
هل هذا صحيح؟ أم الأفضل أن اتركهما بشكل منفصل؟

2 Likes

https://sohep-alslamat.herokuapp.com/
الموقع أصبح جاهز لكنني ربطت بين الباك ايند والفرنت ايند دون ان يكونوا على نفس الدومين.

2 Likes

ياس الأفضل أن تفصل بينهما في ما يخص هيروكو… هذا ما أقوم به أنا دائما :grin:

بالتوفيق أخي صهيب :ok_hand:

2 Likes

شكرا لك هشام
وشكراً للجميع على الدعم الفني
لكن لدي سؤال ايه أفضل في الapi
ان نرسل البيانات كparms اما كداتا عادية من خلال طلب post
وما الفرق بين الطريقتين من حيث النتيجة والامان؟

2 Likes

أكيد استعمل POST لكل ال endpoints التي تحتاج إدخال بيانات لأنه أكثر أمانا… حتى هناك بعض ال endpoints الحساسة مثل Logout التي رغم أنها لا تستقبل أي بيانات الا أنه يفضل استعمال POST لأنه أكثر أمانا :grin:

2 Likes

:+1::+1:
ممتاز
اتمنى من خلال النظر الى الموقع ان تعطوني ملاحظاتكم ونصائحكم.

2 Likes

مرحبا صهيب عادةً اي مشروع ستعمل عليه سيكون هناك العديد من المفاتيح التي لا يجب مشاركتها مثل api key او secret key
او المفاتيح التي تحصل عليها من خدمات معينة وخاصة اذا كنت رافع الكود على github
مرة تم حظري من خدمة mailgun لانني شاركت المفتاح السري دون ان انتبه على github لا اعلم كيف اكتشفوا ذلك لكنهم خلال اقل من ٢٤ ساعة قامو بتنبيهي وطالبوني بحذف المفاتيح من المستودع

هناك طريقتان لتجاوز هذه المشكلة
١- قم بإنشاء ملف سميه مثلا secret_keys.py وبداخله ضع جميع الرموز السرية الخاصة بك ثم استدعيها في الملفات اللازمة

from . secret_keys import SECRET_KEY as my_secret_key


SECRET_KEY = my_secret_key
...

وهكذا
لكن لا تنسى ان تعمل ملف gitignore لتخبر الريبو بتجاهل الملفات التي تريد تجاهلها بحيث يبقى محلياً الملف ولا يتم رفعه في المستودع

#inside gitignore
secret_keys.py
...

ماذا لو كنت تتعامل مع الاستضافة مثلا في حالتك هذه heroku هنا ستلجئ لاستخدام متغيرات البيئة ستجدها في اعدادت التطبيق الخاص بك على داشبورد هيروكو داخل الاعدادات في التطبيق

تضيف ال key و value وتحفظ
ثم داخل مشروعك مثلا لو اردت جلب SECRET_KEY الذي حفظته في متغييرات البيئة على الاستضافة

import os
SECRET_KEY = os.environ.get('SECRET_KEY')

لا اعلم ان كان هناك طرق افضل او طرق بديلة لكن هذا سيبعدك عن مخاطر مشاركة المفاتيح السرية واكيد اهل الخبرة @hichem2h @YaserAlnajjar عندهم الحلول :joy:
اعتقد انه عندك فكرة عن الموضوع لكن حبيت اشارك الكلام مع جميع الاعضاء لاني واجهت مشاكل في البداية مع هذه المفاتيح
كل التوفيق لك اخي صهيب @sohep

3 Likes

شكراً لك على هذه الملاحظة المهمة
واتمنى ان يتم اغناء الموضوع.

2 Likes

بالمناسبة لو اردت تغيير ال secert الحالي و توليد مفتاح جديد يوجد عدة طرق ومنها
١- افتح terminal or cmd
٢- شغل البايثون
٣- استدعي مكتبة secrets
٤- اكتب هذا السطر
secrets.token_hex(24) ثم انتر سيتولد لديك سيكرت جديد قم باستخدامه

python
>>> import secrets 
>>> secrets.token_hex(24)
'f96d659f311484abf7dea198f5075da610c388abfd98f0fc'


طبعا لا تشاركه مع احد،
هناك طرق عديدة لتوليد مفتاح سيكرت جديد

4 Likes

طيب ماذا قد يحصل حين يقوم احد باخذ السكرت؟

3 Likes

والله يا صديقي ما بعتقد اني عندي الاجوبة الكافية لكن بطبيعة الحال من اسمه secret يعني سرّي فالافضل يكون سرّي

ما الاضرار المترتبة بالضبط ماعندي اي فكرة ننتظر اجابات دسمة عن الموضوع

3 Likes

2 posts were merged into an existing topic: مالطريقة المناسبة لعمل تطبيق شات chat app؟

شرح رائع جدا يا سامر، بوركت :ok_hand:

بالنسبة لنشر المفاتيح، فكل واحد له أضراره…

مثلا نشر الـ secret keys يعرض بيانات المستخدمين للخطر، فهو يستعمل في عدة أماكن:

https://stackoverflow.com/a/15383766/4565520

JSON object signing
crypto functions for salted hmacs or seeding the random engine which impacts:
password reset token
comment form security to protect against forged POST requests
form security
protect against message tampering as the message framework may use cookies to pass messages between views.
protect session data and create random session keys to avoid tampering as well.
create random salt for most password hashers
create random passwords if necessary
create itself when using startproject
create CSRF key

يعني لو تم سرقة قاعدة البيانات، من الممكن أن يتم فك تشفير جميع بيانات المستخدمين :shushing_face:

ولو تم تسريب مفتاح mailgun فيمكن جلب ايميلات مستخدمي موقعك!

والأسوء هو تسرب مفتاح AWS… يمكن عمل سيرفرات على حسابك والتحكم بها، وكل هذا محسوب من رصيد بطاقتك الائتمانية :exploding_head:

4 Likes