前言
关于实践《Python入门到实践》项目3:Web应用程序所碰到的一系列坑
提示:以下是本篇文章正文内容,下面案例可供参考
一、版本匹配问题
特别注意:各工具之间版本匹配问题是非常关键的,有时候不是你代码写得不对,而是版本之间不兼容或者写法变了的问题。对于我这种初学者和身边无人请教的人来说,版本所引起的问题常常是最耗费心思的。
《Python入门到实践》第二版,此书所用到的工具版本分别是:
- python3.5.0
- django1.8.5
- bootstrap3
书上的版本已经太过于老久了,如果不注意指定安装与书上一样的版本,在练习的过程中会频繁踩版本所导致的坑。以下列举几种情况:
Q1:topic = models.ForeignKey(Topic)
tip:TypeError: init() missing 1 required positional argument: ‘on_delete’
cause:在django2.0后,定义外键和一对一关系的时候需要加 ‘on_delete’ 选项,此参数为了避免两个表里的数据不一致问题。
resolve:topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
Q2:url(r’’, include(‘learing_logs.urls’), namespace=‘learning_logs’))
tip:TypeError: url() got an unexpected keyword argument ‘namespace’
cause:在django2.0之后版本已经修改代码格式
resolve:修改以下内容
# 修改导入内容
from django.contrib import admin
from django.urls import path, include
# 修改namespace规格
path('', include(('learning_logs.urls', "learning_logs"), namespace='learning_logs')),
Q3:from django.contrib.auth.views import login
tip:ImportError: cannot import name ‘login’
cause:模块写法变化导致
resolve:from django.contrib.auth.views import LoginView
Q4:bootstrap3 {% bootstrap_form form %}
tip:cannot import name ‘BoundField’ !
cause:写法是没错的,只是版本不匹配导致的
resolve:
# 先在虚拟环境下升级下pip
(ll_env) D:\learning_log>py -m pip install --upgrade pip
# 再安装bootstrap3, 我自己用的是python3.9, 对照着改就可以
(ll_env) D:\learning_log>pip3.9.exe install django-bootstrap3
Q5:from django.core.urlresolvers import reverse
tip:ModuleNotFoundError: No module named ‘django.core.urlresolvers’
cause:django2.0 把原来的 django.core.urlresolvers 包 更改为了 django.urls
resolve:from django.urls import reverse
Q6:WARNINGS:?: (2_0.W001) Your URL pattern ‘^edit_entry/(?P<entry_id>\d+)/$’ …
cause:django2.0后urls的配置发生了改变
resolve:
# 把url函数换成path,正则写法改变成re_path
原先:url(r'^topics/$', views.topics, name='topics'),
修改:re_path('^topics/$', views.topics, name='topics'),
注意记得加上导入!! from django.urls import path, re_path
二、部署问题
项目中把本地代码远程上传到heroku服务器,你可能会遇到以下几个问题。
Q1:在项目推送到heroku时,执行命令heroku login
tip:press any key to open up the browser to login or q to exit
resolve:把登录命令换成 heroku login -i
Q2:把修改后的仓库推送到Heroku服务器
tip:django.core.exceptions.ImproperlyConfigured: You’re using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
cause:因为该项目最初是从一个临时目录构建的。只查找/app目录,项目将无法正常构建
resolve:
settings.py 中的if语句在书中看起来是这样的:
# Heroku settings
if os.getcwd() == '/app':
import dj_database_url
修改后
# Heroku settings
cwd = os.getcwd()
if cwd == '/app' or cwd[:4] == '/tmp':
import dj_database_url
Q3:把修改后的仓库推送到Heroku服务器
tip:## Warning - The same version of this code has already been built: …
cause:中途修改代码后没有先提交到git
resolve:
(ll_env) D:\learning_log>git commit -am "备注"
(ll_env) D:\learning_log>git status 查看下有没有毛病,没有再执行下一条命令
(ll_env) D:\learning_log>git push heroku master
Q4: (ll_env) D:\learning_log\ll_env>py manage.py runserver
tip:can’t open file ‘D:\learning_log\ll_env\manage.py’: [Errno 2] No such file or directory
cause:没有在manage.py目录下执行命令
resolve:在manage.py所在目录执行py manage.py runserver
…
总结
其实我遇到的问题不止这么多,但记录到的内容和能想起来的也就这么多了。作为一个初学者,身边没有大佬可以请教,因为版本问题而引起的错误,百思不得其解和查找不到方法的情况下,我只能重做。整个项目我至少重新推翻做了4次,最后一次才比较顺利完成。不过还是挺感谢众多网络平台和网友进行分享,大部分问题还是能在网上找到解决办法的。
在一次次的推翻这个项目的时候,在一个整下午都找不到解决办法的时候,心态浮躁和挫败感袭来是很正常的情况。但在一次次成功解决自己猜测导致错误的问题后,又会很兴奋。我在默默无闻地砌塔,无论这一过程需要重新推翻多少次…永不放弃。
晒一下项目最终成果记录一下
最后,一点小心得。
-
如果你同我一样是新手的话,《Python入门与实践》这本书第一章到十一章确实是不错的引领进门的师傅。但如果做项目3的话,不建议在什么都不了解的情况下做,因为版本迭代造成了许多坑,对我们的学习是极其不利的。可以先到B站或者先学习下Django中文社区里的项目https://www.django.cn/course/course-2.html
-
如果你想尝试着做项目3的话,请使用python以及django的最新版本进行学习,虽然会由此引起很多版本不匹配的问题,但大多数问题已经罗列出来了。并且也为你准备了几份参考文章,对照书上和这几篇文章进行学习,我相信应该能比较顺利。
- Python 入门项目——Django入门
- Python 项目:Django 构建Web应用程序添加用户账户
- Python项目:Django 设置应用程序的样式并进行部署
- Python入门与实践更新的内容
有点悲催就是我几乎做完了才找到以上的文章…TAT…希望对你们有帮助吧。