文章目录
Deploy heroku
Video Resources
Checklist of Deployment Steps
- He carried out the steps I found in the video from his github And a list of steps is included here.
- Copy the project seperately
- Go to 'Getting Started on Heroku with Python'
- Create an Heroku account
- install pipenv
- Install git ( check git --version)
- Install Heroku CLI
- Login heroku
- Create a virtual enviroment
- Run manage.py not gonna run - pip freeze nothing installing
- Check which version django,requests you have and install it
- Run manage.py and then stop it
- Go to django heroku
- Create a Procfile and
- Install django-heroku
- Add stuff to settings.py file
- Install guincorn
- pip freeze > requirements.txt
- heroku create attreyaweb (to create an app on heroku)
- git status git commands (git push heroku master)
- Open up the website
- Admin panel not working. heroku run bash. Migrations
Preparation
Create an account
- To create a heroku account, click here this is a platform, similar to github, which is also managed through git, so you have to register an account and eventually deploy the server to heroku with the git command
Create python and Django runtime environments with pipenv / anaconda
- The reason he mentions
install pipenv
is to create a virtual environment withpipenv
, which can also be created withanaconda
; the purpose of a virtual environment is to protect your local python environment, which can create an isolated environment without affecting everything locally, in which you can create any Python runtime environment, or delete the virtual environment at any time- I use the command
conda create -n server python=3.9
, which creates a virtual environment namedserver
with python version3.9
. - The python version must be chosen very carefully, because the latest version of heroku only supports a few python versions, so if you choose the wrong python version when the deployment is done in heroku, it will also report a version error.
- As for the versions it supports now, you can check here; note whether you have Heroku-20 or Heroku-22, I deployed with Heroku-22 so I went straight to 3.9 python
- I use the command
Install git
- Install git, this is to ensure that your local git can push the code to the remote repository, this should be OK as long as you have used github or gitlab partners
Install heroku cli
- Create a heroku scaffold heroku cli, the method of this installation official website also gives
- I have an Apple system, so I installed heroku’s scaffolding in the first way
- Logging in to heroku is a step we’ll take later, so let’s not rush here.
- We’ve also finished creating the virtual environment, which was created with anaconda; this step should actually be a part of the environment before writing the code, but if you’re here, you’ve obviously finished writing the code, so if you’re not using the python version supported by heroku, you’d better use conda to reallocate an environment, and then copy and paste the code into the new environment to debug it and see if it works.
Installing gunicorn
- Note: Be sure to install gunicorn in your own environment
pip install gunicorn
This won’t work in your local environment, and it won’t work on your local runtime server, but when you upload your code to heroku, he will use [gunicorn](https://devcenter.heroku.com/ articles/django-app-configuration) to deploy it for you, so gunicorn must be present in your environment so that it can be pushed to the remote heroku repository along with the requirements.txt generated by the next freeze operation
Generate requirements.txt file
- The next step of
pip freeze > requirements.txt
is to export all your python environments to the requirements.txt file, which is a list of all the libraries you need to run your code, and will be read from it when you deploy and configure the deployment environment for you remotely. This file records the list of libraries you need to run your code.If you have this problem in your requirements.txt, you have to take care of it, delete the content after it and replace it with the version number manually, just like the others. = version number`
Create the Procfile file manually
- Next, you need to create a
Procfile
file **without a suffix! No suffix! No suffix! ** (macs tend to default to txt format for files without a suffix, so be sure to pay attention to this, this file is truly suffix-free) - The contents of the
Procfile
file isweb: gunicorn myproject.wsgi
wheremyproject
is replaced with the name of your file, for example, in my server, it should beweb: gunicorn djangoServer.wsgi
This file is very important forheroku
deployment is very important, otherwise the deployment will definitely fail - The location of this file is as follows.
Install django-heroku
- Next is to install
django-heroku
, install commandpip install django-heroku
- Follow the instructions of the official website to set the content of setting.py, the official website recommended how you write you write
- Modify your original
settings.py
file in Django according to the one recommended on the official site. - I’ve posted my own
settings.py
here for your reference, with particular attention toALLOWED_HOSTS = ["*"]
which must not be left out.
""" Django settings for djangoServer project. Generated by 'django-admin startproject' using Django 3.2. For more information on this file, see https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ import datetime from pathlib import Path import dj_database_url import os from django.test.runner import DiscoverRunner from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent """ Heroku """ IS_HEROKU = "DYNO" in os.environ SECRET_KEY = "CHANGE_ME!!!! (P.S. the SECRET_KEY environment variable will be used, if set, instead)." if 'SECRET_KEY' in os.environ: SECRET_KEY = os.environ["SECRET_KEY"] # Generally avoid wildcards(*). However since Heroku router provides hostname validation it is ok if IS_HEROKU: ALLOWED_HOSTS = ["*", 're-echidna-django.herokuapp.com'] else: ALLOWED_HOSTS = ['*','re-echidna-django.herokuapp.com'] # SECURITY WARNING: don't run with debug turned on in production! if not IS_HEROKU: DEBUG = True # Application definition # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-pm42jjw)=bp1*8m3+vd=#kfnbe99213px8yb9*_7^%r6d$wlii' # 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', 'RE_app.apps.AppConfig', 'corsheaders' ] MIDDLEWARE = [ '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', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware' ] CORS_ORIGIN_ALLOW_ALL = True CORS_ALLOW_CREDENTIALS = True ROOT_URLCONF = 'djangoServer.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'RE_app', 'templates')] , '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 = 'djangoServer.wsgi.application' # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'ENGINE': None, # 'ENGINE': 'djongo', # 'NAME': BASE_DIR / 'db.sqlite3', # 'NAME': 'RE_ECHIDNA', # 'ENFORCE_SCHEMA': False, # 'CLIENT': { # 'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'} # 'host': 'mongodb+srv://ZIYUQ:<password>@cluster0.366apt7.mongodb.net/?retryWrites=true&w=majority'} } } # Password validation # https://docs.djangoproject.com/en/3.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/3.2/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ STATIC_URL = '/static/' # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' """ Heroku """ # Test Runner Config class HerokuDiscoverRunner(DiscoverRunner): """Test Runner for Heroku CI, which provides a database for you. This requires you to set the TEST database (done for you by settings().)""" def setup_databases(self, **kwargs): self.keepdb = True return super(HerokuDiscoverRunner, self).setup_databases(**kwargs) # Use HerokuDiscoverRunner on Heroku CI if "CI" in os.environ: TEST_RUNNER = "djangoServer.settings.HerokuDiscoverRunner" # Default primary key field type # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # print(os.path.join(BASE_DIR, 'RE_app', 'templates'))
- Modify your original
Manually create a runtime.txt file specifying the version of python to deploy
- The final step before deployment is to create a runtime.txt text file in a folder with the version of python you want the remote to use.
To clarify, here my local python is actually 3.9.0 but I venture to judge that the remote 3.9.15 should be compatible with 3.9.0 and the remote only supports so many python versions that I can only choose 3.9.15 so I can tell you here that the local 3.9 series of python should not affect the deployment.
Formal deployment
- With all the previous preparations, you can now start deploying.
- Go to your project folder, in my own case I just go to the outermost djangoServer folder and go to.
- Go to your project folder, in my own case I just go to the outermost djangoServer folder and go to.
Login to heroku in the terminal
heroku login
Login to your own heroku account, he will pop up a screen, just login. (If you are using vpn, try to disconnect it when you do this step, otherwise it may say your ip address is inconsistent)
Create heroku repository in terminal
- At this point create a heroku repository
heroku create xxxxx
with any name you want, for example Iheroku create re-echidna-dataportal
and it will create a repository under your heroku account.
- Since we are creating the repository directly in a non-empty local folder, next we need to
init
the local folder and associate it with the remote repository. You can also follow the deployment instructions in your own project (but the official website gives the steps to build a remote repository from zero and pull it locally, where you complete your code tasks and push it to the remote, if you are following my method where the code is already written locally and the project folder is no longer empty, then follow my method).
init the local project folder and associate it with the heroku created remotely
git init
heroku git:remote -a xxxx
xxx is the name of the create- At this point, we’ve established a connection between the local files and the remote repository
Push the local project to heroku to complete the deployment
git add .
Commit all local files to the local repositorygit commit -am "Just Say Anything"
git push heroku master
Once this is executed, the remote will prepare the runtime environment based on your requirements, select the python version via runtime and check if it’s supported, and finally deploy it via procfile