YOLO813

备注 - 如何创建一个Django新项目

    配置python虚拟环境,参考

    配置scss。

    Django版本:

Django                3.1.7

    mysql版本:

select version();
=>10.6.8-MariaDB


    创建项目:

django-admin startproject NewProject

    定义模板路径,并在一级目录下创建Templates文件夹,其中builtins的作用在于内置static标签,原因参考

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR/ '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',
            ],
            'builtins':['django.templatetags.static']
        },
    },
]


    加入网站500的提醒邮件

    数据库创建专门的网站链接用户:

grant all privileges on database.* to zhangxiaofei@'%' identified by "pwd" with grant option;
flush privileges; # 刷新权限!这句话和mysql的分号一样,一定不要少


    创建新的数据库。

    定义数据库链接:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database',
        'USER': '_web',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}


    时区相关:

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
# USE_TZ = True
USE_TZ = False
#去掉结尾自动添加的斜杠
APPEND_SLASH=False


    开发时,打开数据库日志记录,方便随时优化SQL语句,参考文章

set global general_log=1;
# 查找日志所在路径
show global variables like "%datadir%";
# show variables like "%char%";


    根据已有的表生成模型,创建新的app,建立models文件:

python manage.py inspectdb > log

        项目上传至服务器,生成迁移语句,建表

python manage.py makemigrations
python manage.py migrate


    配置url文件。

    添加后台:

# urls.py
urlpatterns = [
    path('admin', admin.site.urls),
]
# admin.py
from django.contrib import admin
from .models import yourmodel

admin.site.site_header = 'header'
admin.site.site_title = 'title'

class yourmodelAdmin(admin.ModelAdmin):
    '''分页:每页20条'''
    list_per_page = 20
    '''过滤选项'''
    list_filter = ('display', 'state', ) 
    list_display =('vacancy_id','display')
    search_fields = ['=vacancy_id']
admin.site.register(yourmodel,yourmodelAdmin)
# 创建superuser
python manage.py createsuperuser


    windows电脑上配置mysql、logstash、elasticsearch数据同步。参考文章

#   logstash配置文件
input {
  jdbc {    
    #根据type的不同输出到es的不同索引
    type => "type_table"
    jdbc_driver_library => "D:/mysql-connector-java-8.0.23.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/your_database"
    jdbc_user => "root"
    jdbc_password => "root"
    jdbc_paging_enabled => true
    jdbc_page_size => "10000"
    tracking_column => "unix_ts_in_secs"
    record_last_run => "true"
    last_run_metadata_path => "D:/.logstash_jdbc_last_run"
    clean_run => "false"
    use_column_value => true
    tracking_column_type => "numeric"
    schedule => "*/10 * * * * *"
    statement => "SELECT *, UNIX_TIMESTAMP(up_date) AS unix_ts_in_secs FROM your_table WHERE (UNIX_TIMESTAMP(up_date) > :sql_last_value AND up_date < NOW()) ORDER BY up_date ASC"
  }
}
filter {
  mutate {
    copy => { "id" => "[@metadata][_id]"}
    remove_field => ["unix_ts_in_secs"]
  }
}
output {
  stdout { 
    codec =>  "rubydebug"
    # JSON格式输出
    #codec => json_lines
  }
  if [type] == "type_table" {
    elasticsearch {
      index => "your_es_index"
      document_id => "aus-%{[@metadata][_id]}"
    }
  }
}


    建立es索引。

    换表,重启logstash文件,将数据库数据同步至elasticsearch。

    启动项目查看

python3 manage.py runserver 0.0.0.0:8000

    没有问题后创建 uwsgi.ini文件。

    创建supervisord守护进程。

    CF中添加子域名A记录。

    一台云服务器上配置多个项目,参考测试-nginx挂载两个域名。由于我是多个子域名挂在CF上,所以干脆使用如下命令申请了一个lets encrypted的泛域名证书*.domain.com

certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/MyScripts/.secrets/cloudflare.ini \
  -d *.domain.com \


    配置nginx配置文件,在conf.d文件夹下新建一个second.conf文件

upstream DEMOsite {
# 设定目录自动创建,即ngnix和uwsgi通讯的sock位置
# 一定要和demo1.ini中定义的socket一致
  server unix:///srv/XX/YY.sock;
}
server {
  listen       80;
  server_name  DOMAIN.com;
  rewrite ^(.*) https://$host$1 permanent;
    
}
server {
    listen       443 ssl;
    server_name  DOMAIN.com;

    charset utf-8;
    access_log  logs/DOMAIN.access.log  main;

    ssl_certificate      /etc/letsencrypt/live/DOMAIN.com-0001/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/DOMAIN.com-0001/privkey.pem;
    ssl_protocols       TLSv1.3;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_session_tickets off;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # 静态文件访问的url
    location /static {
               # 静态文件地址
      alias /srv/StaticFile;
      expires 1h;
        }
     location /media {
       alias /srv/media;
         }

        location / {
      # 这个uwsgi_pass对应的参数一定要和upstream定义的一样
      uwsgi_pass  DEMOsite;
      # uwsgi_params文件地址
      include     /usr/local/nginx/conf/uwsgi_params;
        }
     location /robots.txt{
       alias   /srv/robots/robots.txt;
     }
    error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    python manage.py collectstatic 命令,收集静态文件(主要是admin后台的样式)。

    定时切割nginx脚本。

    

备注:

# windows配置部署es+logstash同步mysql数据库
https://www.cnblogs.com/mrzhao520/p/14119031.html