简单记录一下做的项目过程中踩过的坑

跟着《Python编程:从入门到实践》做了下项目二

想在虚拟环境python374中安装matplotlib报错:(执行命令conda install matplotlib)

简单记录一下做的项目过程中踩过的坑

pip install –user matplotlib安装出错,应该是网络连接不稳定

简单记录一下做的项目过程中踩过的坑

切换到base环境发现已经有了matplotib,于是在base环境中执行python代码,

参考链接:https://blog.csdn.net/weixin_45090728/article/details/110913557

matplotlib相关函数官方文档指路:https://matplotlib.org/stable/api/pyplot_summary.html

用plot绘制点要用到marker(指定标记(点)的样式)和markersize(指定标记(点)的大小)参数,用linewidth参数也可以指定点的大小,但最好还是用markersize

学习plot方法官方文档指路:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot

例题15-4将使用更长的距离选择列表,结果是点更密集,将-1 从 x 或 y 方向列表中删除,会导致所有点的x坐标或y坐标都是正的。

——————————

重新在主目录/home/erin下安装了firefox88.0.1版,用~/firefox/firefox打开这个firefox浏览器,在网络设置中选择不使用系统代理,国内的搜索引擎可以用,但国外的谷歌、维基等都不能用,尝试下载各种vpn组件不可用,参考

——————————

安装pygal出现错误:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ProxyError(‘Cannot connect to proxy.’, NewConnectionError(‘

简单记录一下做的项目过程中踩过的坑

查看pygal官网:http://www.pygal.org/,发现pygal is available for python 2.7 and 3.2, 3.3, 3.4, 3.5 and pypy.因为本机是python3.7的环境,猜测是版本不匹配,或者网络连接不稳定等。

简单记录一下做的项目过程中踩过的坑

于是点击available on PyPI,选择下载pygal-2.4.0-py2.py3-none-any.whl,放到自己的anoconda/pkgs目录下,我的路径是/home/erin/anaconda3/pkgs

简单记录一下做的项目过程中踩过的坑

命令行执行命令conda activate base,进入base环境,然后执行pip install anaconda3/pkgs/pygal-2.4.0-py2.py3-none-any.whl,安装成功

简单记录一下做的项目过程中踩过的坑

然后打开python环境,import pygal成功!

————————————————

(1)使用anaconda本地安装Python第三方包 whl文件,参考windows教程https://blog.csdn.net/qq_17249717/article/details/90106101,将第三方包放在/anaconda/pkgs/目录下,然后base环境(或其他虚拟环境)下执行pip 第三方包路径,安装成功

(2)使用anaconda本地安装python包的方法:

1.下载zip,tar.gz等压缩包(就是自己 需要的python包)

2.将压缩包解压到 ~anaconda3/pkgs/ 下面(这个路径存放所有已经安装的python包)

3.进入该python包的解压目录 ,输入 python setup.py install 命令,回车
原文链接:https://blog.csdn.net/qq_39657585/article/details/82667450

——————————

解决deepin的vim不能不能用鼠标复制粘贴的问题,参考

参考这个博客使用git连接远程仓库:https://www.cnblogs.com/spmt/p/10735070.html,但按照github上的指引操作,用https连接时出现拒绝连接错误,一通操作后没有解决该问题:

fatal: unable to access 'https://github.com/Erin-hua/python-study.git/': Failed to connect to 127.0.0.1 port 8889: 拒绝连接

换成ssh连接成功!!!

https://github.com/Erin-hua/python-study.git

git@github.com:Erin-hua/python-study.git

————————

2021.5.21

sudo apt-get remove python 后出错:

py3compile can not found

简单记录一下做的项目过程中踩过的坑

参考该链接,删除了/usr/bin/py3compile,但备份到了主目录/notes/upgrade_level/python下

简单记录一下做的项目过程中踩过的坑

——————————

2021.5.21继续学习python项目

randint(1, self.num_sides)

返回的值是一个闭区间[1,self.num_sides]

——————————

2021.5.22

做例题16-1时发现无法从http://www.wunderground.com/history/找到Comma-Delimited File链接,从而下载csv格式的天气数据,参考该连接https://www.jianshu.com/p/ee24b4e14123,该方法失效,无法下载,只能之后有时间再学习一下网络爬虫(待解决)

16.2.4节无法使用pygal.i18n模块获取国别码,报错:

ModuleNotFoundError: No module named 'pygal.i18n'

因为pygal已经没有i18n模块,要改用pygal_maps_world.i18n

conda install安装时出错:

简单记录一下做的项目过程中踩过的坑

简单记录一下做的项目过程中踩过的坑

pip install也报错:

简单记录一下做的项目过程中踩过的坑

于是去Python的软件库PYPI官网下载pygal_maps_world-1.0.2的压缩包:https://pypi.org/project/pygal_maps_world/

并放在~/anaconda3/pkgs/下解压缩,cd到pkgs目录下的该被解压缩的包的文件夹下,执行命令:

conda activate base(或者其他环境)
python setup.py install

然后import pygal_maps_world成功!

然后所有代码中的pygal.i18n都替换成pygal_maps_world.i18n

print(country_code, COUNTRIES[country_code])

相当于把print中要输出的都变为字符串类型输出,int转变类型为str等

print(country_code + " " + COUNTRIES[country_code])

16.2.5节制作世界人口地图

import pygal
wm = pygal.Worldmap()

出错:

AttributeError: module 'pygal' has no attribute 'Worldmap'

参考该链接(https://blog.csdn.net/Leo_Franklin/article/details/81201434)应该将这两行代码代替为:

import pygal_maps_world.maps
wm = pygal_maps_world.maps.World()

但这样失去了交互性,加上import pygal成功恢复交互性

————————

2021.5.23

conda list查看conda安装的所有包的信息

virtualbox导入ubuntu镜像,参考链接:

(1)下载ubuntu的iso镜像

具体安装看到需要20g内存劝退了,到时候再说

想爬虫又出错:

简单记录一下做的项目过程中踩过的坑
简单记录一下做的项目过程中踩过的坑

换成另外的代码test_socket.py测试:

import requests
import time

url = 'https://bbs.csdn.net/topics/391929842'
try:
    r = requests.get(url)
except requests.exceptions.ConnectionError:
    time_sleep = 0

while True:
    time.sleep(1) # 自己随便定义多少秒
    try:
        r = requests.get(url)
    except requests.exceptions.ConnectionError:
        time_sleep = time_sleep + 1

        if time_sleep == 10:
             print("Your Internet connect error!!")
             break

        else:
             print("max connect try: " + str(time_sleep) + ", error")
             break

仍然出错:

简单记录一下做的项目过程中踩过的坑
简单记录一下做的项目过程中踩过的坑

参考该链接(https://www.cnblogs.com/peida/archive/2013/03/06/2945407.html)ping 127.0.0.1(本机)没有问题

简单记录一下做的项目过程中踩过的坑

找了各种方法行不通,python代码在windows上倒是能跑通,大概是之前deepin设置了代理或者别的问题

参考该链接

ping www.baidu.com

没有问题:

简单记录一下做的项目过程中踩过的坑

尝试终端curl www.baidu.com

提示bash: curl: 未找到命令

于是执行命令:

sudo su
apt-get install curl

curl是一个非常实用的、用来与服务器之间传输数据的工具(http://aiezu.com/article/linux_curl_command.html)

继续执行curl www.baidu.com

报错:

curl: (7) Failed to connect to 127.0.0.1 port 8889: 拒绝连接

参考该链接:

https://blog.csdn.net/weixin_38705903/article/details/101911553

在终端输入export -p,发现有ftp_proxy、http_proxy、https_proxy

简单记录一下做的项目过程中踩过的坑

应该是之前折腾过vpn,又卸载了,但是相关配置没有删除干净,之后curl www.baidu.com成功

学习linux export用法:

(1)链接1

(2)链接2

(3)链接3

(4)链接4

用命令删除这三个变量:

export -n ftp_proxy
export -n http_proxy
export -n https_proxy

或参考该链接https://www.cnblogs.com/eat-too-much/p/7976084.html

执行以下命令后unset对应的proxy变量,grep命令用于查找文件里符合条件的字符串

export | grep "proxy"
export | grep "PROXY"
unset ftp_proxy
unset http_proxy
unset https_proxy

但变量实际上并未删除,只是不会输出到后续指令的执行环境中,保证不出现错误connect refused[111],root权限下是没有这些proxy变量的。

参考该链接https://www.cnblogs.com/fuhai0815/p/9753585.html进行操作,但进入/home/erin/.bashrc文件,没有和ftp_proxy、http_proxy、https_proxy相关的代码,无法做到完全删除,非常的迷幻,只能每次暂时用export -n proxy等命令保证当前访问时删除了proxy变量,pip或者conda在当前访问都能用了,暂时将就凑合一下用用,科研狗不敢再随意造作了(没得时间,手动狗头),找时间再彻底解决这个问题

我又回来了,之前用windows迷失了自己,导致deepin和linux用的不熟练,突然发现设置->网络->系统代理,有无、手动、自动三个选项,打开看到是手动界面,换成无界面,选择确定,然后终端export -p就没有proxy这些变量了!!!普天同庆!!!

这样一来,之前在虚拟环境python374用pip安装pygal包时不成功的问题也解决了(但不知道为啥conda install不行)!果断转移阵地到虚拟环境python374中跑代码,特别是项目三的web应用程序,免得base环境过于臃肿。

——————————

2021.5.24

继续学习爬虫

学习17.1.5节时输出第一个星级最高的python项目的相关信息

简单记录一下做的项目过程中踩过的坑

学习17.2节时给图表添加自定义提示报错:

AttributeError: 'NoneType' object has no attribute 'decode'

简单记录一下做的项目过程中踩过的坑

参考该链接,有的项目description属性是none,空的,Pygal根据与键’value’相关联的数 字来确定条形的高度,并使用与’label’相关联的字符串给条形创建工具提示,所以对lable的值取str:

'label': str(repo_dict['description']),

————————

项目三

因为本来就安装了Anoconda,所以也就不用安装virtualenv虚拟环境管理工具了,前者更强大

执行命令时:

django-admin.py startproject learning_log .

报错:

/home/erin/anaconda3/envs/python374/bin/django-admin.py:19: RemovedInDjango40Warning: django-admin.py is deprecated in favor of django-admin.

  RemovedInDjango40Warning,

翻译一下就是 django-admin.py 已经被 django-admin 取代,下次用的时候去掉”.py”就行了

然后再创建数据库:

python manage.py migrate

运行第一个Django项目成功!

简单记录一下做的项目过程中踩过的坑
简单记录一下做的项目过程中踩过的坑

如果出现错误消息”That port is already in use”(指定端口已被占用),请执行命令python manage.py runserver 8001,让Diango使用另一个端口;如果这个端口也不可用,请不断执行上述命令,并逐渐增大其中的端口号,直到找到可用的端口。

要获悉可在模型中使用的各种字段,可以参考Django Model Field Reference(Django模型字段参考),https://docs.djangoproject.com/en/1.8/ref/models/fields/

激活某个应用程序的数据(models.py)之前,需要将该应用程序包含在项目中,即在learning_log/learning_log/settings.py中,在INSTALLED_APPS元组中包括该应用程序的名字。

每当需要修改”学习笔记”管理的数据时,都采取如下三个步骤:

1.在项目(learning_log)的应用程序(learning_logs)目录下修改对应的models.py;
2.在项目(learning_log)的目录下对 learning_logs调用makemigrations(python manage.py makemigrations learning_logs);
3.让Django迁移项目(python manage.py migrate)。

然后向管理网站(admin site)注册在models.py中添加的模型类(class)

learning_log/learning_log目录下的文件相当于存项目的全局设置的文件,learning_log/learning_logs目录是创建的一个具体的应用程序,可以有多个应用程序,但项目三中目前只需要一个应用程序即可。

——————————

2021.5.26

创建超级用户成功:

简单记录一下做的项目过程中踩过的坑

条目—entry

models.py相当于数据库,其中的class(每个继承了models.Model的类都是表)

迁移模型entry时报错:

topic = models.ForeignKey(Topic)
TypeError: __init__() missing 1 required positional argument: 'on_delete'

简单记录一下做的项目过程中踩过的坑

指定外键时少了参数on_delete,设置多对一关系时,如果设置级联删除,也就是删除一条信息时,会级联的删除所有和这一条信息对应的另一张表的多个信息,就指定on_delete=models.CASCADE,不想设置级联删除就指定on_delete=DO_NOTHING(参考链接

http://localhost:8000/admin/访问管理网站(admin site)

每次修改模型后,都需要重启shell(python manage.py shell),这样才能看到修改的效果。要退出shell会话,可 按Ctr + D。

做例题18.2时,先在管理网站中添加一个不超过50个字符的条目(entry)。

如果只是修改models.py中某些方法而不是修改变量,即不是修改”学习笔记”管理的数据,则对 learning_logs调用makemigrations、让Django迁移项目时都没有反应,不过最好每次修改都进行这两个步骤:

简单记录一下做的项目过程中踩过的坑

执行命令python manage.py shell,启动django shell,做测试,不足50个字符的条目打印出来后面就没有省略号了。

修改之前:

简单记录一下做的项目过程中踩过的坑

修改之后:

简单记录一下做的项目过程中踩过的坑

例题18.4:

1.在目录pizzeria下创建项目pizzeria,注意最后的点不能省略,执行命令:

django-admin startproject pizzeria .

2.创建migrate数据库,执行命令:

python manage.py migrate

3.执行命令,启动服务器,查看这个项目是否创建成功,ctrl+c退出:

python manage.py runserver

4.在目录pizzeria下创建应用程序pizzas:

python manage.py startapp pizzas

5.将应用程序pizzas包含到项目pizzeria中,修改pizzeria/pizzeria目录下的settings.py文件,在INSTALLED_APPS元组中添加应用程序pizzas的名字字符串:’pizzas’。

6.修改pizzeria/pizzas目录下的models.py,添加Pizza和Topping模型。

7.在pizzeria目录下对pizzas调用makemigrations:

python manage.py makemigrations pizzas

8.让Django迁移项目:

python manage.py migrate

9.为了方便管理网站(admin site)管理模型,在pizzeria目录下创建超级用户:

python manage.py createsuperuser

10.向管理网站注册模型,修改pizzas目录下的models.py,手动注册我们的模型,添加以下代码:

from pizzas.models import Pizza, Topping

admin.site.register(Pizza)
admin.site.register(Topping)

11.启动服务器:python manage.py runserver,并访问管理网站:http://localhost:8000/admin/,可以看到已经添加的Pizza和Topping模型,并且使用管理网站输入一些比萨名和配料:

简单记录一下做的项目过程中踩过的坑

12.执行命令启动django shell:

python manage.py shell

结果如下:

简单记录一下做的项目过程中踩过的坑

ctrl+d退出shell。

——————————

2021.5.26

查看管理网站时发现添加的主题的时间和自己电脑的时间不同,查资料发现django中的代码:

date_added = models.DateTimeField(auto_now_add=True)

参数auto_now_add默认是UTC时间,即国际标准时间-伦敦时间,我们是东8区的时间,解决办法是对在learning_log/learning_log目录中的settings.py修改:

TIME_ZONE = 'Asia/Shanghai'

将TIME_ZONE = ‘UTC’注释了

创建主页时意识到程序用的django3和书上django1版本有不同之处,尝试改进learning_log/learning_log/urls.py报错:

File"/home/erin/notes/upgrade_level/python/python_work/web_application/learning_log/learning_log/urls.py", line 21, in <module>
    path('', include('learning_logs.urls', namespace='learning_logs')),
File "/home/erin/anaconda3/envs/python374/lib/python3.7/site-packages/django/urls/conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
</module>

django3对django1做了改进,应该在include函数里增加了参数app_name,表示app的名字,即include函数的第一个参数应该是一个两元元组,应该将代码:

path('', include('learning_logs.urls', namespace='learning_logs')),

改成:

path('', include(('learning_logs.urls', 'learning_logs'), namespace='learning_logs')),

其实去掉namespace参数也不影响效果,为了避免以后出错,暂时还是这样写。

然后在learning_log/leaning_logs/urls.py中尝试改进,发出警告:

WARNINGS:
?: (2_0.W001) Your URL pattern '$' [name='index'] has a route that contains '(?P<', begins with a '^', or ends '$'. this was likely an oversight when migrating to django.urls.path(). < code></',>

尝试改动的代码是:

path('$', views.index, name='index')

参考链接

总结得到:

1.把url函数换成path

2.不适用^,$作路由

之前的path(r’^$’)用path(”)代替即可,输入http://localhost:8000/成功展示index.html显示的内容。

——————————

例题18.6

1.映射url,修改pizzeria/pizzeria目录下的urls.py的变量urlpatterns,添加元素:

path('', include(('pizzas.urls', 'pizzas'), namespace='pizzas')),

即访问原有的url(http://localhost:8000/),会跳转到应用程序pizzas对应的网页

2.在pizzeria/pizzas目录下新建urls.py,变量urlpatterns是一个列表,包含可在应用程序pizzas中请求的网页。

3.修改pizzeria/pizzas目录下的views.py,views.py中的函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器—— 这通常是使用定义了网页是什么样的模板(html或其他)实现的。

4.在pizzeria/pizzas目录下新建templates文件夹,在templates文件夹下新建pizzas文件夹,在最后的pizzas文件夹下新建index.html,作为模板渲染主页。

——————————

每个网页都在对应应用程序目录下的urls.py中设置urlpattern,在views.py中编写一个函数指定urlpattern,并编写一个模板(html或其他)。视图函数传递context到html,context是一个字典,键名是在html中用于访问数据的名称,值是要发送给模板(html)的数据

要在模板中打印变量,需要将变量名用双花括号括起来,但双花括号不会出现在网页中

HTML标签 表示一个项目列表项,在标签对 内部,位于标签 <li>&#x548C;</li>之间的内容都是一个项目列表项。

显示所有主题的页面成功:

简单记录一下做的项目过程中踩过的坑

——————————

2021-5-27

18.4.3小节显示特定主题和对应条目的页面

1.修改learning_log/learning_logs目录下的urls.py,书上的源代码:

&#x7279;&#x5B9A;&#x4E3B;&#x9898;&#x7684;&#x8BE6;&#x7EC6;&#x9875;&#x9762;
url(r'^topics/(?P\d+)/$', views.topic, name='topic'),

因为django3和django1不同,不需要正则表达式,修改如下:

path('topics/<topic_id>', views.topic, name='topic')
</topic_id>

2.因为自作主张修改视图函数代码:

def topic(request):
    """&#x663E;&#x793A;&#x5355;&#x4E2A;&#x4E3B;&#x9898;&#x53CA;&#x5176;&#x6240;&#x6709;&#x7684;&#x6761;&#x76EE;"""
    topic_id = int(request.GET.get(topic_id))
    topic = Topic.objects.get(id=topic_id)

报错:

TypeError: topic() got an unexpected keyword argument 'topic_id'

按照书上的代码修改成功:

def topic(request, topic_id):
    """&#x663E;&#x793A;&#x5355;&#x4E2A;&#x4E3B;&#x9898;&#x53CA;&#x5176;&#x6240;&#x6709;&#x7684;&#x6761;&#x76EE;"""
    topic = Topic.objects.get(id=topic_id)

简单记录一下做的项目过程中踩过的坑

简单记录一下做的项目过程中踩过的坑

extends时是模板具体的位置+名称,但在href中以链接的形式要用命名空间的表示法

报错:

ModuleNotFoundError: No module named 'django.core.urlresolvers'

因为django更新到2.0后,django2.0把原来的django.core.urlresolvers包更改为了django.urls包

——————

从 django-1.11开始,基于函数的登录,注销等视图已被重写为基于类的视图:LoginView和 LogoutView类。

引用代码:

from django.contrib.auth.views import login

变为:

from django.contrib.auth.views import LoginView

还有其他变化,参考链接

————————

2021-5-28

Django使用模板标签{% csrf_token %}来防止攻击者利用表单来获得对服务器未经授权的访问(这种攻击被称为跨站请求伪造)。

管理网站的用户名是erin_admin

登陆页面设置成功:

简单记录一下做的项目过程中踩过的坑

注销:

简单记录一下做的项目过程中踩过的坑

学习链接: Django权限系统auth

————————

新增一个用户sakura,密码和erin_admin的一样

限制用户访问页面时,

&#x6211;&#x7684;&#x8BBE;&#x7F6E;
LOGIN_URL = '/users/login/'

向项目说明用户未登陆时应该重定向的页面路径,完整路径是http://localhost:8000/users/login

——————

设置django自带的404错误界面报错:

You&#x2019;re seeing this error because you have DEBUG = True in      your Django settings file. Change that to False, and Django      will display a standard 404 page.

简单记录一下做的项目过程中踩过的坑

查资料发现learning_log/learning_log目录下的settings.py文件中DEBUG的值是True,出错时不管是谁都能看到错误的地方,在生产过程中不需要,因此将DEBUG的值设为了False,然后启动服务器报错:

CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

显然DEBUG的值是False时需要设置settings.py中的ALLOWED_HOSTS的值,这个变量是设置了之后,别人只能通过这个变量中的ip地址或者域名来进行访问(参考链接),暂时设置成ALLOWED_HOSTS = [‘*’],允许任何人可以访问,但同时这样也会出现错误:Django设置DEBUG为False时,’django.contrib.staticfiles’会关闭,即Django不会自动搜索静态文件。这样的问题待解决,最好用nginx或apache部署静态资源(20章解决了)(参考链接

简单记录一下做的项目过程中踩过的坑

——————————

Http404官方代码:

class Http404(Exception):
    pass

Http404就是一个简单的Exception子类,用raise Http404可以显示Django自带的404页面。

————————

20章

<html lang="en"></html>,这里的lang=”en”可以删除,如果不删除的,用谷歌之类、设置了自动翻译的浏览器打开,它会认为是英文的,会自动给翻译;但这样可以输出中文,只是会让浏览器提示要不要翻译此页,如果改成zh-cn就没有翻译的选项了。

”,这个是设置的编码为UTF-8的

原来的base.html的代码:

<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a> -
  <a href="{% url 'learning_logs:topics' %}">Topics</a> -
  {% if user.is_authenticated %}
    Hello, {{ user.username }}.

    <a href="{% url 'users:logout' %}">log out</a>
  {% else %}
    <a href="{% url 'users:register' %}">register</a> -
    <a href="{% url 'users:login' %}">log in </a>
  {% endif %}
</p>

{% block content %}{% endblock content %}

——————————

2021.5.31

导航栏其实就是一个以 打头的列表,其中每个链接都是一个列表项 。

设置导航栏的样式成功:

简单记录一下做的项目过程中踩过的坑

简单记录一下做的项目过程中踩过的坑

设置index成功:

简单记录一下做的项目过程中踩过的坑

设置login页面时,从login.html中删除了{% if form.errors %}代码块,因为django-bootstrap3会自动管理表单错误,用bootstrap3设置登陆页面成功:

简单记录一下做的项目过程中踩过的坑

修改new_topic.html成功:

简单记录一下做的项目过程中踩过的坑

修改topic.html成功:

简单记录一下做的项目过程中踩过的坑

修改new_entry.html时注意这一对标签不能少右标签。

——————

部署学习笔记到服务器上(Heroku)

1.安装最新的Heroku Toolbelt版本:

终端运行命令:

curl https://cli-assets.heroku.com/install.sh | sh
heroku --version

下载得到的版本是:heroku/7.54.0 linux-x64 node-v12.21.0

终端cd到learning_log目录,执行命令:

pip freeze > requirements.txt

得到项目依赖的包列表:

简单记录一下做的项目过程中踩过的坑

设置runtime.txt之后运行程序,如果出现错误消息,指出不能使用你指定的Python版本,请访问https://devcenter. heroku.com/并单击Python,再单击链接Specifying a Python Runtime。浏览打开的文章,了解支持的Python版本,并使用与自己使用的Python版本最接近的版本。

在settings.py末尾添加一个片段、指定一些Heroku环境设置时,应该将代码:

if os.getcwd() == '/app':

改为:

if os.getcwd() == '/learning_log':

Heroku使用PostgreSQL (也叫Postgres)——一种比SQLite更高级的数据库。

项目被推送到Heroku时,它将不会包含原来为空的文件夹。

为停止heroku local启动的进程,按Ctrl + C(不知道为啥得按两次)

git跟踪对本地数据库的修改是不可取的,应忽略后缀为sqlite3的文件,如果在服务器上使用的是SQLite,将项目推送到服务器时,可能会不小心用本地测试数据库覆盖在线数据库。

——————————

安装Heroku CLI后执行书上的命令:heroku login,登陆后报错(不管有没有代理都是):IP address mismatch

查了资料发现,书上的命令应该换成:heroku login -i,(手机用小飞机并且开代理,之前deepin装飞机失败,暂时这么操作,之后再尝试)使用邮箱名和密码登录,之后heroku create,然后git push heroku master失败报错,是python版本问题:

简单记录一下做的项目过程中踩过的坑

——————

为了解决python版本不匹配heroku的问题,准备创建conda虚拟环境python3710,python版本是3.7.10,但出错:

(base) erin@erin-PC:~$ conda create --name python3710 python=3.7.10
Collecting package metadata (current_repodata.json): failed

>>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<<

    Traceback (most recent call last):
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/gateways/connection/session.py", line 52, in __call__
        return cls._thread_local.session
    AttributeError: '_thread._local' object has no attribute 'session'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/exceptions.py", line 1074, in __call__
        return func(*args, **kwargs)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/cli/main.py", line 84, in _main
        exit_code = do_call(args, p)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/cli/conda_argparse.py", line 82, in do_call
        exit_code = getattr(module, func_name)(args, parser)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/cli/main_create.py", line 37, in execute
        install(args, parser, 'create')
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/cli/install.py", line 265, in install
        should_retry_solve=(_should_retry_unfrozen or repodata_fn != repodata_fns[-1]),
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/solve.py", line 117, in solve_for_transaction
        should_retry_solve)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/solve.py", line 158, in solve_for_diff
        force_remove, should_retry_solve)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/solve.py", line 262, in solve_final_state
        ssc = self._collect_all_metadata(ssc)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/common/io.py", line 88, in decorated
        return f(*args, **kwds)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/solve.py", line 415, in _collect_all_metadata
        index, r = self._prepare(prepared_specs)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/solve.py", line 1004, in _prepare
        self.subdirs, prepared_specs, self._repodata_fn)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/index.py", line 214, in get_reduced_index
        repodata_fn=repodata_fn)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/subdir_data.py", line 97, in query_all
        result = tuple(concat(executor.map(subdir_query, channel_urls)))
      File "/home/erin/anaconda3/lib/python3.7/concurrent/futures/_base.py", line 598, in result_iterator
        yield fs.pop().result()
      File "/home/erin/anaconda3/lib/python3.7/concurrent/futures/_base.py", line 435, in result
        return self.__get_result()
      File "/home/erin/anaconda3/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
        raise self._exception
      File "/home/erin/anaconda3/lib/python3.7/concurrent/futures/thread.py", line 57, in run
        result = self.fn(*self.args, **self.kwargs)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/subdir_data.py", line 90, in <lambda>
        package_ref_or_match_spec))
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/subdir_data.py", line 102, in query
        self.load()
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/subdir_data.py", line 166, in load
        _internal_state = self._load()
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/subdir_data.py", line 240, in _load
        repodata_fn=self.repodata_fn)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/core/subdir_data.py", line 462, in fetch_repodata_remote_request
        session = CondaSession()
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/gateways/connection/session.py", line 54, in __call__
        session = cls._thread_local.session = super(CondaSessionType, cls).__call__()
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/gateways/connection/session.py", line 85, in __init__
        self.headers['User-Agent'] = context.user_agent
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/_vendor/auxlib/decorators.py", line 268, in new_fget
        cache[inner_attname] = func(self)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/base/context.py", line 696, in user_agent
        builder.append("%s/%s" % self.os_distribution_name_version)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/_vendor/auxlib/decorators.py", line 268, in new_fget
        cache[inner_attname] = func(self)
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/base/context.py", line 738, in os_distribution_name_version
        from .._vendor.distro import id, version
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/_vendor/distro.py", line 1084, in <module>
        _distro = LinuxDistribution()
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/_vendor/distro.py", line 600, in __init__
        if include_lsb else {}
      File "/home/erin/anaconda3/lib/python3.7/site-packages/conda/_vendor/distro.py", line 943, in _get_lsb_release_info
        raise subprocess.CalledProcessError(code, cmd, stdout, stderr)
    subprocess.CalledProcessError: Command 'lsb_release -a' returned non-zero exit status 126.

$ /home/erin/anaconda3/bin/conda create --name python3710 python=3.7.10

  environment variables:
                 CIO_TEST=<not set>
        CONDA_DEFAULT_ENV=base
                CONDA_EXE=/home/erin/anaconda3/bin/conda
             CONDA_PREFIX=/home/erin/anaconda3
    CONDA_PROMPT_MODIFIER=(base)
         CONDA_PYTHON_EXE=/home/erin/anaconda3/bin/python
               CONDA_ROOT=/home/erin/anaconda3
              CONDA_SHLVL=1
                     PATH=/home/erin/anaconda3/bin:/home/erin/anaconda3/bin:/home/erin/anaconda3
                          /condabin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
       REQUESTS_CA_BUNDLE=<not set>
            SSL_CERT_FILE=<not set>
            XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
         XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0

     active environment : base
    active env location : /home/erin/anaconda3
            shell level : 1
       user config file : /home/erin/.condarc

 populated config files : /home/erin/.condarc
          conda version : 4.7.12
    conda-build version : 3.18.9
         python version : 3.7.4.final.0
       virtual packages :
       base environment : /home/erin/anaconda3  (writable)
           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /home/erin/anaconda3/pkgs
                          /home/erin/.conda/pkgs
       envs directories : /home/erin/anaconda3/envs
                          /home/erin/.conda/envs
               platform : linux-64
             user-agent : conda/4.7.12 requests/2.22.0 CPython/3.7.4 Linux/5.0.0-13-generic Linux/unknown glibc/2.24
                UID:GID : 1000:1000
             netrc file : /home/erin/.netrc
           offline mode : False

An unexpected error has occurred. Conda has prepared the above report.

If submitted, this report will be used by core maintainers to improve
future releases of conda.

Would you like conda to send this report to the core maintainers?

[y/N]: y

Upload successful.

Thank you for helping to improve conda.

Opt-in to always sending reports (and not see this message again)
by running

    $ conda config --set report_errors true

</not></not></not></module></lambda>

依次执行命令:(1)conda clean –packages (2)conda clean –all (清除索引)(3)conda update –all,解决问题Collecting package metadata (current_repodata.json): failed,不成功。参考链接

看了这个链接(https://www.codeleading.com/article/28072185336/),不敢下手,我觉得我也没改过utf和gbk,就暂时码在这。

在base环境中升级pip之后,仍然没有解决问题。

python -m pip install --upgrade pip

参考这两个链接,终于解决了!

(1)subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1.
(2)subprocess.CalledProcessError: Command ‘lsb_release -a’ returned non-zero exit status 126.

为保险起见,将/usr/bin/lsb_release这个可执行文件先复制到一个文件夹下,然后sudo,执行命令rm -rf /usr/bin/lsb_release,conda命令终于可以用了呜呜呜

————————————

然后执行命令rm -rf .git,删除在python374环境下创建的git仓库,换到python3710环境,重新再来一遍配置:

pip install django

pip install django-bootstrap3

curl https://cli-assets.heroku.com/install.sh | sh

还有其他书上指定的包,然后按照书上的步骤创建仓库,执行命令git push heroku master时报错:

remote: -----> $ python manage.py collectstatic --noinput
remote:        Traceback (most recent call last):
remote:          File "manage.py", line 22, in <module>
remote:            main()
remote:          File "manage.py", line 18, in main
remote:            execute_from_command_line(sys.argv)
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
remote:            utility.execute()
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/core/management/__init__.py", line 413, in execute
remote:            self.fetch_command(subcommand).run_from_argv(self.argv)
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/core/management/base.py", line 354, in run_from_argv
remote:            self.execute(*args, **cmd_options)
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/core/management/base.py", line 398, in execute
remote:            output = self.handle(*args, **options)
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 187, in handle
remote:            collected = self.collect()
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 114, in collect
remote:            handler(path, prefixed_path, storage)
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 338, in copy_file
remote:            if not self.delete_file(path, prefixed_path, source_storage):
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 248, in delete_file
remote:            if self.storage.exists(prefixed_path):
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/core/files/storage.py", line 318, in exists
remote:            return os.path.exists(self.path(name))
remote:          File "/app/.heroku/python/lib/python3.7/site-packages/django/contrib/staticfiles/storage.py", line 38, in path
remote:            raise ImproperlyConfigured("You're using the staticfiles app "
remote:        django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.

remote:
remote:  !     Error while running '$ python manage.py collectstatic --noinput'.

remote:        See traceback above for details.

remote:
remote:        You may need to update application code to resolve this error.

remote:        Or, you can disable collectstatic for this application:
remote:
remote:           $ heroku config:set DISABLE_COLLECTSTATIC=1
remote:
remote:        https://devcenter.heroku.com/articles/django-assets
remote:  !     Push rejected, failed to compile Python app.

remote:
remote:  !     Push failed
remote: Verifying deploy...

remote:
remote: !   Push rejected to thawing-hamlet-56796.

remote:
To https://git.heroku.com/thawing-hamlet-56796.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: &#x65E0;&#x6CD5;&#x63A8;&#x9001;&#x4E00;&#x4E9B;&#x5F15;&#x7528;&#x5230; 'https://git.heroku.com/thawing-hamlet-56796.git'
</module>

这个bug我直呼好家伙,查资料了解了一下django中STATIC_ROOT和STATIC_URL、STATICFILES_DIRS,学习链接,查了半天还是得到stackoverflow上找,参考链接,把书上要输入的代码删除:

if os.getcwd() == '/app':

我还傻乎乎地把app改成了当前项目的名字learning_log做尝试:)(仍然存在bug,已解决)

Anyway,只用把if那行代码删掉就行,其他的代码不用改动,也不用删除STATICFILES_DIRS,千万别忘了改动代码之后要git status查看一下仓库的状态,执行git add或git commit -am “描述语句…”把这次的改动提交。

增加STATIC_ROOT的代码之后执行命令:

python manage.py collectstatic

然后报错:

ModuleNotFoundError: No module named 'psycopg2'

pip安装psycopg2:

pip install psycopg2

再执行命令python manage.py collectstatic,成功在learning_log目录下生成staticfiles文件夹:

简单记录一下做的项目过程中踩过的坑

然后git status,确实生成了staticfiles文件,git add . 跟踪该文件夹,然后git commit -am “…”,最后执行命令git push heroku master,将项目推送到heroku成功,在线应用程序的URL是:https://thawing-hamlet-56796.herokuapp.com/

简单记录一下做的项目过程中踩过的坑

————————

python pathlib和os的区别:https://zhuanlan.zhihu.com/p/141740018

————————

为核实正确地启动了服务器进程,执行命令heroku ps:

简单记录一下做的项目过程中踩过的坑

Free dyno hours quota remaining this month: 550h 0m (100%)表明该项目在这个月可在550小时内处于活动状态。

执行命令:

heroku run python manage.py migrate

现在如果访问这个部署的应用程序,使用命令heroku open在浏览器中打开这个应用程序,将能够像在本地系统上一样使用它,但看不到在本地部署中输入的任何数据,因为它们没有复制到在线服务器。一种通常的做法是不将本地数据复制到在线部署中,因为本地数据通常是测试数据,这就是为什么在.gitignore文件中输入*.sqlite3,不上传本地数据。

为了管理数据,创建超级用户,可以看到服务器包含的文件和目录与本地系统相同:

简单记录一下做的项目过程中踩过的坑

执行命令重命名URL:

heroku apps:rename learning-log

访问项目的URL从https://thawing-hamlet-56796.herokuapp.com/变成了https://erin-learning.herokuapp.com/,git也变了

简单记录一下做的项目过程中踩过的坑

简单记录一下做的项目过程中踩过的坑

尝试设置只能heroku访问项目后不知不觉无法从本地访问项目了,报错:

ImproperlyConfigured       at /
settings.DATABASES is improperly configured. Please supply the NAME value.

。。。现在就是后悔,非常后悔,查资料后发现其实很简单,仍然是报错:

django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.

仍然是if语句块中的STATIC_ROOT问题,把这行代码挪到if外面就可以了:)

STATIC_ROOT = 'staticfiles'
Heroku&#x8BBE;&#x7F6E;
if os.getcwd() == '/app':
...

这样在本地和服务器上都可以访问项目了,参考链接

Original: https://blog.csdn.net/qq_27144571/article/details/122810075
Author: erin sakura
Title: 简单记录一下做的项目过程中踩过的坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766730/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球