@Django
一个小白的自学之路
这是我在CSDN上的第一篇文章,主要是为了记录自己自学一个框架的过程,整个过程都会一直更新,主要为了督促自己可以更好的去学习,如果我的学习过程可以帮到你,那我会很高兴。 学习中经常取得成功可能会导致更大的学习兴趣,并改善学生作为学习的自我概念。
为什么学?
这个篇文章的写作时间是2021年7月,也就是我毕业的时间,这个时间比较尴尬,很多公司招人都着了差不多了,所以招的人数和工资都会被压缩,每天都在看各种招聘信息,感觉自己缺少的东西真的太多了,因此想丰富一下自己的知识结构。
要学习的主要原因有以下几个点:
- 工作目标 ,我的大学本科是计算机科学与技术一个很尴尬的专业,这个专业啥都学,但是啥都不深,再一次偶然的机会我接触到了Python,知识接触到了很少的一部分,但是慢慢的发现自己喜欢上了这个语言;
- 自我劝说,为啥叫自我劝说呢?因为我想到了这个词,对就是这么任性,这个主也是一个偶然的机会,我在大三期间有一个课程,需要写一篇文章,我文章叙述点是编程语言的发展,其中就有Python,然后我也慢慢了解到了Python的发展速度,这应该就是让我继续学Python的一个关键节点吧;
- 入坑指南,前面说了,我开始知识接触到了一点点的Python,然后呢我就开始了自己的自学Python之旅,从基本的数据类型,到各种方法的应用,然后到了爬虫,慢慢的自己也逐渐接受了这个快速的开发语言;
- 第一个项目,也不能说是一个项目吧,其实就是一个简单的毕设,我大学毕设题目的选题是一个人脸识别,这个也是要是自己之前学了一段时间想看看自己学的咋样,因此,就选择Python作为开发语言,做了一个人脸识别,用的算法是OpenCV,整个项目做完感觉还是可以的,这个可能是我坚持做Python的一个因素吧;
- 专业培训,计算机专业的很多人都知道有计算机培训机构,我去了一段时间,待了2天,为什么没有继续待下去呢,主要原因是我这边确实有些事情需要处理一下,所以就放弃了,说一下自己的感受吧,我听了两天的课,对,你没听错,我去了第一天就去上课了,虽然很累我还是很开心,培训机构讲的一下知识确实很细,但是呢这是在我学过的前提下,我的专业课老师曾经告诉过我,学校和培训机构的最大区别就是学校会告诉你为什么,教育机构会告诉你记住这么用就行了;这次学习吧,感觉还可以,虽然只有2天;
- Django,我之前自学过爬虫,虽然都是很低级的,但是爬点
美女 图片还是可以的,然后自己在找工作过程中发现确实有很多公司需要你去会这个框架,因此想自学一下。
学习路径
万能的哔哩哔哩。
学习过程
在这就开始记录自己的学习过程了,记录下自己学到的每一个知识点,如果你还在读大学,没准期末考试会看到。
安装软件
别问我什么自学了这么久你还没有软件,我做毕设,然后以防我们的bug10出问题,所以我就半年甚至一年多没更新过系统,又一次忘记点中断更新了,然后他就更新了,然后系统有个文件就有问题了,然后我就傻了,每天写论文都是提心吊胆,每天论文都会进行备份,程序也会备份,所以在毕设过程结束后我就重装了电脑,对于软件的安装就不过多叙述了,下载软件,就一直next就行了,我这里给一个我自己用的版本和一个文件(懂的都懂):提取码:28qj
Python安装教程在此不再赘述了,大家可以自行去Python官网进行下载,如果Python官网没有你想用的Python版本,可以去问问度娘。
开始学习
现在开始记录我的学习过程,可能会不全,那就是还在学习过程中,正在持续更新中… python版本:3.6(提取码:f7j4)(3.6/3.7/3.8/3.9都有) Django版本:2.2.12(使用pip,然后修改等号后面的版本即可)
安装框架
我是直接用pycharm里面的自带安装插件之间安装的,选用的版本呢是2.2.12,为什么选择这个版本呢,不是因为最新的就是这个版本,我写文章的时候最新的版本是3.2.5,差了1个大版本,选择这个版本的原因是2.2.12是LTS版本(什么是LTS?目前那个是LTS);具体内容请看链接,以及适合你当看到这个文章时候的LTS版本可能会新一些,具体怎么安装呢?
图片介绍如上。
创建第一个项目
很多人都用的是命令创建,我用的pycharm直接创建的,在这里给一个大佬们的创建方式: 我的创建方式: 创建好了,然后他就报错了。 惊不惊喜意不意外!报错如下
Traceback (most recent call last):
File "D:/Django/mysite1/manage.py", line 22, in <module>
main()
File "D:/Django/mysite1/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "D:\Django\mysite1\venv\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
utility.execute()
File "D:\Django\mysite1\venv\lib\site-packages\django\core\management\__init__.py", line 325, in execute
settings.INSTALLED_APPS
File "D:\Django\mysite1\venv\lib\site-packages\django\conf\__init__.py", line 79, in __getattr__
self._setup(name)
File "D:\Django\mysite1\venv\lib\site-packages\django\conf\__init__.py", line 66, in _setup
self._wrapped = Settings(settings_module)
File "D:\Django\mysite1\venv\lib\site-packages\django\conf\__init__.py", line 157, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "C:\Users\10938\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "D:\Django\mysite1\mysite1\settings.py", line 58, in <module>
'DIRS': [os.path.join(BASE_DIR, 'templates')]
NameError: name 'os' is not defined
大概意思就是没定义os,我打开了相关的文件: 修改方法: 导入os模块:
import os
然后在运行:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 16, 2021 - 21:21:07
Django version 2.2.15, using settings 'mysite1.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
第一行是报红的,原因是版本过高或过低,但是问题不大,然后我就打开了他给的链接:http://127.0.0.1:8000/,至此第一个项目运行成功! 你以为这就结束了?为了解决这个
Watching for file changes with StatReloader
我去查了很多资料,说法也不一样,我使用了一种方法进行修正,就是版本不匹配问题,然后我就又去差了Django所匹配的Python版本,
我一看心中暗喜,我用的Python版本是3.8,我以为是自己的版本不对导致的,所以我就找了一个很匹配的版本,也就是Python3.6,我就把原来的版本卸载,又卸载了pycharm,然后重新搞了一遍,然后运行发现还是有那个错,具体原因我也不知为啥,但是这个错不影响我运行,然后我把浏览器关了,停止了项目,当我再打开项目再次运行的时候,又出错了,
Performing system checks...
Watching for file changes with StatReloader
System check identified no issues (0 silenced).
Exception in thread django-main-thread:
Traceback (most recent call last):
File "C:\Users\10938\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\10938\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "D:\Django\mysite1\venv\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
fn(*args, **kwargs)
File "D:\Django\mysite1\venv\lib\site-packages\django\core\management\commands\runserver.py", line 120, in inner_run
self.check_migrations()
File "D:\Django\mysite1\venv\lib\site-packages\django\core\management\base.py", line 453, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "D:\Django\mysite1\venv\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "D:\Django\mysite1\venv\lib\site-packages\django\db\migrations\loader.py", line 49, in __init__
self.build_graph()
File "D:\Django\mysite1\venv\lib\site-packages\django\db\migrations\loader.py", line 212, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "D:\Django\mysite1\venv\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
if self.has_table():
File "D:\Django\mysite1\venv\lib\site-packages\django\db\migrations\recorder.py", line 56, in has_table
return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
File "D:\Django\mysite1\venv\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
return self._cursor()
File "D:\Django\mysite1\venv\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
self.ensure_connection()
File "D:\Django\mysite1\venv\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
self.connect()
File "D:\Django\mysite1\venv\lib\site-packages\django\db\backends\base\base.py", line 195, in connect
self.connection = self.get_new_connection(conn_params)
File "D:\Django\mysite1\venv\lib\site-packages\django\db\backends\sqlite3\base.py", line 194, in get_new_connection
conn = Database.connect(**conn_params)
TypeError: argument 1 must be str, not WindowsPath
大致错误是这个
TypeError: argument 1 must be str, not WindowsPath
错误原因呢是因为值得接收有问题,修改方法如下:
这里是错误的,修改如下: 把传回的数据类型转为str就可以了。 在这里说一下,如果你想更换你的端口号,可以使用以下命令: 这个命令是将端口号改为5000,可以根据自己需要进行端口号的修改。 如果修改不成功,可以查看一下,是不是python3不是你的批处理命令,可以再试试:
python manage.py runserver 5000
修改成功会出现以下提示:
(venv) D:\Django\mysite1>python manage.py runserver 5000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 17, 2021 - 07:50:30
Django version 2.2.12, using settings 'mysite1.settings'
Starting development server at http://127.0.0.1:5000/
Quit the server with CTRL-BREAK.
如果你用的是pycharm不知道在哪执行这个批处理命令,如下图: 如果启动时候出现了端口占用,可以这样做:
报错小结
起初以为不可运行错误均是代码错误,经过多个版本测试,发现是3.x版本问题,当我将3.2.x版本卸载之后,给电脑默认安装了2.2.12版本之后,发现之前的错全部消失了。
项目结构
-
db.sqlite3文件:项目首次运行后生成的文件,是Django的默认数据库 -
manage.py文件:命令存储, -
项目的同名文件夹:
sttings.py配置文件
首先解读一下这个句话,BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file))) 使用print直接输出一下os.path.abspath(file),
我们得到了该sttings文件的路径。 继续看os.path.dirname(os.path.abspath(file)),我们继续用print输出查看: 发现os.path.dirname该方法就是返回参数的上一级目录,也就是说BASE_DIR存放的是项目的绝对路径。
DEBUG = True
启动模式
-
True - 调试模式 检测代码改动后,立刻重启服务 报错页面 -
False - 正式启动模式/上线模式 出错了不会进行多余提示,只会告诉你错了
ALLOWED_HOSTS = []
请求头 HOST头 主要在上线以后的过滤访问使用。 在虚拟机上启动项目,然后使用我们的Windows去访问,需要将内网IP添加到ALLOWED_HOSTS中。
ROOT_URLCONF = ‘untitled1.urls’
Django访问的主路由,一般情况下不会变。
DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.sqlite3’, ‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’), } }
数据库配置,后面会换成MySQL。
LANGUAGE_CODE = ‘en-us’
语言设置,改成中文:
LANGUAGE_CODE = ‘zh-Hans’
TIME_ZONE = ‘UTC’
时区,UTC标准时间,如果运行日志中时间不对,原因是中国国内时间差8个时区,修改方法:
TIME_ZONE = ‘Asia/Shanghai’
小总结
URL
定义:统一资源定位符 作用:用来表示互联网上某个资源的地址 如下图: 详细解释各个部分:
http默认是80,一般不写
‘?’后面都是查询字符串,‘&’并。格式为key=value ‘#’后面就是锚点,锚点可以帮我直接定位到网页上的具体位置。
Django处理URL请求
模拟如下:
path(‘page/2003’,views.page_2003), views.page_2003是视图
视图函数
定义: 注意第一个参数是request 返回值必须是HttpResponse对象 样例: 具体操作: 这部分主要是我们想加一个网页访问时,我们需要如何添加一个新的地址访问,首先我们要找到我们的主路由文件: 其中admin是默认生成的,我们无需修改,然后我们添加如下代码:
path('page/2003', views.page_2003_view),
注意后面的逗号 这句话也就是为我们的网站添加一个跳转,也就是127.0.0.1:8000/page/2003/,当用户访问我们的page/2003路由时,Django会查询
views.page_2003_view
的相关视图。 当我们添加相关的跳转之后,还需要我们去添加这个视图,添加方法如下:
新建python文件views.py,该文件里面创建相关的方法,导入HttpResponse方法。
def page_2003_view(request)
此处的方法名要和路由配置里面的视图方法名一致 默认第一个参数为request,必须有第一个参数。
详细代码如下:
from django.http import HttpResponse
def page_2003_view(request):
html = "<h1>这是我的第一个页面</h1>"
return HttpResponse(html)
返回路由配置文件,添加导入方法。
from . import views
网页运行结果如下:
|