实战学习开源项目学习之启动项目

Posted 黑黑白白君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战学习开源项目学习之启动项目相关的知识,希望对你有一定的参考价值。



依然开源项目(dailyfresh-B2C)为例:
在这里插入图片描述


1)根据start.md进行

内容如下:

#### 虚拟环境   
开启worker,         
列出所有:lsvirtualenv    
workon df-env (退出 deactivate)     

#### requirements.txt用来记录项目所有的依赖包和版本号:     
```pip freeze >requirements.txt```

安装requirement.txt:    
```pip install -r requirements.txt```


建立索引数据  
python manage.py rebuild_index

----
### Linux    
#### mysql    
mysql -uroot -p     
password: Mathkk123+-      

查看运行状态     
systemctl status mysqld.service     


#### redis    
检查端口: netstat -ltnp |grep 6379    
启动:  service redisd start      
关闭:  service redisd stop      

可进入终端    
cd /usr/local/redis-5.0-rc3/src    
./redis-cli    
查看库  
select 1
所有数据   
keys * hgetall cart_2    



#### celery启动异步注册任务
#### 虚拟环境   
开启worker,     (退出 deactivate)     
workon df-env    

在项目目录下执行:cd /opt/dailyfresh-celerytasks    
```celery -A celery_tasks.tasks worker -Q queue --loglevel=info``````celery -A celery_tasks.tasks worker --loglevel=info ```


##### FastDFS启动分布式文件存储系统
##### 启动fastdfs服务命令如下:   
```service fdfs_trackerd start```
```service fdfs_storaged start```

#### 测试Tracker 和 Storage 服务通信       
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf     

#### 查看服务    
netstat -unltp|grep fdfs     


#### nginx   
#### 启动nginx   
cd /usr/local/nginx/sbin/   
./nginx   

#### 查看nginx服务   
ps aux|grep nginx    

1.1 开启虚拟环境

具体部署可见本栏的《【实战学习(二)】开源项目学习之准备工作》(https://blog.csdn.net/m0_37621024/article/details/115834177)

1.2 安装/检查项目所有的依赖包

具体部署可见本栏的《【实战学习(三)】开源项目学习之Django框架简介以及启动》(https://blog.csdn.net/m0_37621024/article/details/115919142)

1.3 开启/查看mysql的运行

mysql相关的部署可见本栏的《【实战学习(三)】开源项目学习之Django框架简介以及启动》(https://blog.csdn.net/m0_37621024/article/details/115919142)

1.4 开启/查看Redis的运行

Redis的部署可见本栏的《【实战学习(六)】开源项目学习之redis部署》(https://blog.csdn.net/m0_37621024/article/details/116242726)

1.5 执行celery

启动服务使用的指令:

在项目目录下执行:cd /opt/dailyfresh-celerytasks
celery -A celery_tasks.tasks worker -Q queue --loglevel=info

celery -A celery_tasks.tasks worker --loglevel=info

  • -A:指对应的应用程序, 其参数是项目中 Celery实例的位置。

  • worker:指这里要启动的worker。

  • 任务默认是进程执行,如果想要使用高并发,可以使用协程方式执行任务。

  • 默认是进程池方式,进程数以当前机器的CPU核数为参考,每个CPU开四个进程。

  • 如何自己指定进程数:celery worker -A proj --concurrency=4

  • 如何改变进程池方式为协程方式:celery worker -A proj --concurrency=1000 -P eventlet -c 1000

实际执行:

(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ celery -A celery_tasks.tasks worker --loglevel=info
Traceback (most recent call last):
  File "/home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/celery/app/utils.py", line 359, in find_app
    sym = symbol_by_name(app, imp=imp)
  File "/home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/celery/bin/base.py", line 504, in symbol_by_name
    return imports.symbol_by_name(name, imp=imp)
  File "/home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/kombu/utils/imports.py", line 62, in symbol_by_name
    return getattr(module, cls_name) if cls_name else module
AttributeError: module 'celery_tasks' has no attribute 'tasks'

*报错之module ‘celery_tasks’ has no attribute ‘tasks’

查阅了很多资料,依然不行。仔细比对了网上其他人的代码和本地的代码,发现有几行被注释掉了:

# django环境的初始化,在任务处理者worker一端加以下几句
import os
# import django
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
# django.setup()

去掉注释后重新执行:

(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ celery -A celery_tasks.tasks worker --loglevel=info
 
 -------------- celery@he-ThinkPad-X200 v4.2.1 (windowlicker)
---- **** ----- 
--- * ***  * -- Linux-5.8.0-48-generic-x86_64-with-debian-bullseye-sid 2021-05-01 16:29:32
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         celery_tasks.tasks:0x7f20b8d53590
- ** ---------- .> transport:   redis://127.0.0.1:6379/8
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery
                

[tasks]
  . celery_tasks.tasks.generate_static_index_html
  . celery_tasks.tasks.send_register_active_email

[2021-05-01 16:29:33,044: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2021-05-01 16:29:33,060: INFO/MainProcess] mingle: searching for neighbors
[2021-05-01 16:29:34,093: INFO/MainProcess] mingle: all alone
[2021-05-01 16:29:34,131: WARNING/MainProcess] /home/he/.virtualenvs/dailyfresh/lib/python3.7/site-packages/celery/fixups/django.py:200: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
  warnings.warn('Using settings.DEBUG leads to a memory leak, never '
[2021-05-01 16:29:34,131: INFO/MainProcess] celery@he-ThinkPad-X200 ready.
[2021-05-01 16:29:34,136: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[2e0677b0-7799-4514-a8d8-0bd67daf5a28]  
[2021-05-01 16:29:34,680: INFO/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[2e0677b0-7799-4514-a8d8-0bd67daf5a28] succeeded in 0.5425468019966502s: None

注意:其中UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments! 是说 :userwarning:使用settings.debug会导致内存泄漏,请不要在生产环境中使用此设置!

所以在settings配置文件中把debug改为False,再次运行:

(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ celery -A celery_tasks.tasks worker --loglevel=info
 
 -------------- celery@he-ThinkPad-X200 v4.2.1 (windowlicker)
---- **** ----- 
--- * ***  * -- Linux-5.8.0-48-generic-x86_64-with-debian-bullseye-sid 2021-05-01 16:41:13
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         celery_tasks.tasks:0x7f9abf818a10
- ** ---------- .> transport:   redis://127.0.0.1:6379/8
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery
                

[tasks]
  . celery_tasks.tasks.generate_static_index_html
  . celery_tasks.tasks.send_register_active_email

[2021-05-01 16:41:13,606: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2021-05-01 16:41:13,620: INFO/MainProcess] mingle: searching for neighbors
[2021-05-01 16:41:14,653: INFO/MainProcess] mingle: all alone
[2021-05-01 16:41:14,674: INFO/MainProcess] celery@he-ThinkPad-X200 ready.

1.6 FastDFS启动分布式文件存储系统

具体部署请移步本栏的《【实战学习(七)】开源项目学习之FastDFS部署》。(https://blog.csdn.net/m0_37621024/article/details/116331450)

启动fastdfs服务命令如下:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start  # 启动tracker(支持start|stop|restart)
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start

netstat -apn | grep fdfs  # 查看端口情况

测试Tracker 和 Storage 服务通信,即通过monitor来查看storage是否成功绑定 :

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf 

在这里插入图片描述
查看服务 :

he@he-ThinkPad-X200:~$ netstat -unltp|grep fdfs   
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      221674/fdfs_tracker 
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      221668/fdfs_storage 

1.7 启动Nginx

安装及部署可参考本栏的《【实战学习(四)】开源项目学习之Nginx介绍及安装部署》。(https://blog.csdn.net/m0_37621024/article/details/116074201)

he@he-ThinkPad-X200:~$ whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
he@he-ThinkPad-X200:~$ /usr/sbin/nginx

查看nginx服务:

he@he-ThinkPad-X200:~$ ps -aux | grep nginx
root      240129  0.0  0.1  57980  6280 ?        Ss   21:58   0:00 nginx: master process /usr/sbin/nginx
www-data  240677  0.0  0.1  58552  6208 ?        S    22:40   0:00 nginx: worker process
www-data  240678  0.0  0.1  58552  6208 ?        S    22:40   0:00 nginx: worker process
he        240900  0.0  0.0  17676   728 pts/3    S+   23:02   0:00 grep --color=auto nginx

1.8 debug=True的情况下运行

执行完1.1-1.7后,输入python manage.py runserver,浏览器登录localhost:8000,提示Page not found(404):

(dailyfresh) he@he-ThinkPad-X200:~/github-learning/dailyfresh-B2C/dailyfresh$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
May 05, 2021 - 16:37:52
Django version 2.1.7, using settings 'dailyfresh.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Not Found: /
[05/May/2021 16:37:56] "GET / HTTP/1.1" 404 3027

1.8.1 遇到的问题之Page not found(404)

  • 原因:找不到/,说明对于nginx不知道如何处理路径为/的请求。
  • 解决方法:在nginx.conf中添加对应的配置:
# github上给出的nginx.conf的部分内容

worker_processes  1;  # nginx进程数

events {
    worker_connections  1024;  # 单个进程最大连接数(最大连接数=连接数*进程数)
}

http {  # 设定http服务器
    include       mime.types;   # 文件扩展名与文件类型映射表
    default_type  application/octet-stream;  # 默认文件类型

    sendfile        on;  #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;  # 长连接超时时间,单位是秒

    #gzip  on;
	upstream dailyfresh {  # upstream表示负载服务器池,这里配置upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。格式举例:server 192.168.80.121:80 weight=3;
		server 127.0.0.1:8080;
		server 127.0.0.1:8081;
	}

    server {  # 虚拟主机的配置
        listen       80;  # 监听端口
        server_name  localhost;  # 域名可以有多个,用空格隔开
		
		location /{  # 转发请求给uwsgi
			# 包含uwsgi请求的参数
			include uwsgi_params;
			# 转交请求给uwsgi
			#uwsgi_pass 127.0.0.1:8080;  # uwsgi服务器的ip:port(这是单台uwsgi配置)
			uwsgi_pass dailyfresh;  # 根据业务需求,实施负载均衡就用这个
		}

		location /static {
			# 指定静态文件存放的目录
			alias /var/www/dailyfresh/static/;	
		}

		location = /{  # 对 "/" 启用反向代理,当用户访问127.0.0.1时,在nginx中配置把这个请求转发给172.16.66.228:80(nginx)服务器,让这台服务器提供静态首页。
配置如下:
			proxy_pass http://172.16.179.131;  # 设置被代理服务器地址
		}
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }   
    }
}
  • 补充:

    • 如果使用的是python manage.py runserver 这个命令来启动django并且DEBUG=True的话,django默认是会为setting.py里的STATIC_URL变量开头的静态文件请求做路由的。
    • 但是如果用的是uwsgi,并且在生产环境一般设置DEBUG=False,这两种情况django都是不会为STATIC_URL的静态文件做路由的,所以需要在nginx配置里对静态文件提前进行一个转发或者在项目最外层urls.py中做匹配路由,这两种方法都需要将文件收集到STATIC_ROOT中。

2)在开发者模式(Debug=True)下探索该项目

2.1 Django的Debug模式

在settings.py文件中有一个变量为DEBUG,默认值为True:
在这里插入图片描述

2.1.1 DEBUG=True时:

  • 即开启了开发者模式,如果修改了Django项目的代码,只要按下ctrl+s,那么Django就会自动重启项目,不需要手动重启。
  • 如果Django项目中的代码出现bug,在浏览器中和控制台会打印出错信息,方便调试代码。

2.1.1.1 在开发模式下(Debug=True)时,访问静态文件的两种情况:

  • 可以在所在的project下建立相应的app, 然后每个app下都建立相应的static文件夹,文件夹名称一定要是static,Django将通过django.contrib.staticfiles在每个app的static文件夹中自动查找这些静态文件。
  • 配置STATICFILES_DIRS,在所有的app文件外面,建立一个公共的文件夹,,因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为部署模式下最后所有的静态文件都会在STATIC_ROOT里面存在)。
    ————————————————
    版权声明:本文为CSDN博主「光明小学王小雨」的原创文章,遵循CC 4.0
    BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_41475058/article/details/105856148
  • 不过第二种方式比较适合自己写项目的时候,毕竟自己写的时候整个项目都是自己控制的,static文件放一起也清楚,如果是合作写项目的话可以放在每个app下,然后在settings.py里的STATICFILES_DIRS中添加路径。

本项目用的是第二种:
在这里插入图片描述

2.1.1.2 STATIC_ROOT

STATIC_ROOT 是在部署静态文件时(pyhton manage.py collectstatic)所有的静态文静聚合的目录。

  • STATIC_ROOT要写成绝对地址。
  • 只有在部署模式下(Debug=False)时生效。
  • 在部署模式(Debug=False)时,Django会从STATIC_ROOT设置的文件夹读取静态文件,而不再从STATICFILES_DIRS设置的文件夹或app下的static文件夹。所以在(Debug=False)时需要先 python manage.py collectstatic同步一下静态文件。

2.1.1.3 STATIC_URL

  • 当创建Django项目的时候,在setting.py中默认就已经设置了STATIC_URL = ‘/static/’,通过http://127.0.0.1/static/XXX就可以访问相关的静态文件。
  • STATIC_URL其实是一个别名,是用于引用STATICFILES_DIRS或STATIC_ROOT所指向的静态文件的,用{% static %}来引入静态文件的话,就不用每个静态文件都要绝对路径。
STATIC_URL如何能正确地找到静态文件地址?
1、在开发模式下(Debug=True)时:

使用的是STATICFILES_DIRS和app下的static中的静态文件,Django 有默认的对STATIC_URL路由能自动找到放在里面的静态文件。

2、在部署模式(Debug=False)时:

使用的是STATIC_ROOT中的静态文件,此时则没有了默认的对STATIC_URL的路由,需要自己在project的urls.py中写一个,将STATIC_URL开头的请求转发到STATIC_ROOT中进行查找。

还有一种方法是使用文件服务器如nginx来实现:

location /static {
        expires 30d;
        autoindex on;
        add_header Cache-Control private;
        alias /root/myproject/static;
     }
————————————————
版权声明:本文为CSDN博主「光明小学王小雨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41475058/article/details/105856148

此时在应用中加载静态文件的话就只需要将STATIC_URL设为/static/。


2.1.1.4 特别注意在生产环境中,禁止开启DEBUG = True!

  • 因为当网站出错误时,其他人能看到源代码,而且也不需要给用户看到这些错误信息。所以需要关掉DEBUG = True,即设置DEBUG = False。

2.1.2 DEBUG=False时:

  • 即部署模式
  • 如果设置了DEBUG = False,那么就必须设置settings.py中的ALLOWED_HOSTS
  • ALLOWED_HOSTS:其他人只能通过这个变量中的ip地址或者域名来进行访问,可以设置为IP或域名,也可以设置为允许所有的访问(*)。

2.1.3 总结

平时写代码的时候还是直接使用开发模式方便排查错误,当要部署到服务器时再改成部署模式。

2.1.3.1 当改为部署模式(Debug=False)时需要注意几个步骤:

1、修改setting.py中的DEBUG和ALLOWED_HOSTS:
DEBUG = False
ALLOWED_HOSTS = ['*']  # 真正上线部署的时候不建议填成通配符的*,而是要填允许访问的主机域名。
2、修改静态文件配置:
  • STATIC_URL不用修改就使用默认的
  • STATIC_ROOT的路径直接使用了根目录下的static,但是STATIC_ROOT的地址不能与STATICFILES_DIRS中的地址相同的,在部署模式的时候就先注释掉STATICFILES_DIRS中有冲突的地址。
STATIC_URL = '/static/'
# STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# 指定收集静态文件的路径
STATIC_ROOT = 'var/www/dailyfresh/static'
3、project的urls.py添加静态文件路由:

因为在部署模式下默认是没有给静态文件做路由。

# dailyfresh/dailyfresh/urls.py

from django.contrib import admin
from django.urls import path, include

from django.conf import settings  # debug=False
from django.views import static  # debug=False
from django.conf.urls import url  # debug=False


urlpatterns = [
    path('admin/', admin.site.urls),
    path('tinymce/', include('tinymce.urls')),  # 富文本编辑器
    path('search/', include('haystack.urls')),  # 全文检索框架
    path('user/', include('user.urls', namespace='user')),  # 用户模块
    path('cart/', include('cart.urls', namespace='cart')),  # 购物车模块
    path('order/', include('order.urls', namespace='order')),  # 订单模块
    path('', include('goods.urls', namespace='goods')),  # 商品模块
    url(r'^static/(?P<path>.*)$', static.serve,
        {'document_root': settings.STATIC_ROOT}, name='static'),  # debug=False
]


【部分内容参考自】

  • Python实现调用另一个路径下py文件中的函数方法总结:http://www.zzvips.com/article/143382.html
  • 天天生鲜Django项目①:https://blog.csdn.net/weixin_43746433/article/details/104079674?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242
  • Django中DEBUG模式及static静态文件:https://blog.csdn.net/qq_41475058/article/details/105856148

以上是关于实战学习开源项目学习之启动项目的主要内容,如果未能解决你的问题,请参考以下文章

实战学习开源项目学习之FastDFS部署

java学习之即时通信项目实战

STM32学习之大纲

licode学习之编译篇--1

licode学习之编译篇--1

12.PGL图学习之项目实践(UniMP算法实现论文节点分类新冠疫苗项目实战,助力疫情)[系列九]