Django学习Step by Step
第一步创建项目,名字为mysite
- mysite 里面的__init__.py 表示这个mysite文件夹是属于python包,打开一看是空的。空的尼玛留着做肾?
- asgi.py和wsgi.py
asgi.py、wsgi.py
一句话:cgi 进化成 wsgi,wsgi进化成为asgi,都是为了解决特定的问题,以及技术让人变懒变愉快,兼容的特点。
①cgi是啥?
CGI(通用网关接口, Common Gateway Interface/CGI),定义客户端与Web服务器的交流方式的一个程序。
一句人话都没有,艹
看下这个作者的解释https://blog.csdn.net/dzyweer/article/details/79782663
首先 官方对CGI的解释是这样的
CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。
首先大家明白几个概念 ,才能更好的理解CGI
Web 服务器 :指计算机上提供web服务的软件 如 ISS Apache nginx tomcat等。
CGI协议:指一种让web服务器访问计算机系统上面的其他资源的规范和接口
CGI程序:指一种符合CGI协议规范的应用程序
所以CGI的定义就是 :通过一种运行在web服务器上面的CGI程序来访问计算机上的其他资源的机制
具有代表性的CGI程序有:PHP JAVA .NET C Perl 等。
CGI通讯系统的组成:一部分是面向用户的html页面 一部分是在服务器端的CGI程序
CGI工作流程:
1.客户端发起请求
2.web服务器接收到请求,交给合适的CGI程序
3.CGI程序处理后,把结果返回给web服务器
4.web服务器把CGI程序处理的结果转成html格式,返回给客户端。
②WSGI(Web服务器网关接口,Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。可以说WSGI就是基于Python的以CGI为标准做一些扩展。
③ASGI
ASGI(异步网关协议接口,Asynchronous Server Gateway Interface)一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型。
WSGI是基于HTTP协议模式的,不支持WebSocket,
ASGI是能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket,是Django3.0之后才有的。是为了解决Python常用的WSGI不支持一些新的协议标准。ASGI是WSGI的扩展(升级)。
- urls.py字面意思就是路由分发
- settings.py 项目配置
那个templates是模板,暂时不用管
第二步,创建项目mysite后,运行看看
运行命令是 python manage.py runserver
System check identified no issues (0 silenced).
1,You have 18 unapplied migration(s). 你丫有18个没有迁移
Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
你把自带的app,数据库没有迁徙,所以用不了哦,
这些app在哪里呢?说人话!
上图:
Run 'python manage.py migrate' to apply them.
你丫快运行 python manage.py migrate把数据库生成起来丫
January 11, 2023 - 15:38:38 这个命令运行的时间
Django version 4.1.5, using settings 'mysite.settings'
Django的版本是4.1.5,使用了配置'mysite.settings'的settings.py
Starting development server at http://127.0.0.1:8000/ 本地服务器你丫打开看看丫
Quit the server with CTRL-BREAK.退出用,ctrl+break丫
成功了
根据能量守恒定律,物质守恒定律,这个画面怎么来的呢?
我用Everything大法,先用Everything配置一下内容搜索
Everything的内容搜索
content:search:|utf8content:search:|ansicontent:search:|utf16content:search:|utf16becontent:search:
自己建的宏命令 nr
然后搜索D:\mysite\venv\Lib\site-packages nr:"Starting development server at"
哦也,打开代码looklook
Everything大法 再次显灵
看看默认default_urlconf.html模板长什么样
然后找到翻译的一堆高手email
然后再看下自带应用admin的目录结构
第三步 新建一个应用polls
在polls应用里面的view添加代码
HttpResponse
从运行的步骤算起
先在浏览器发起请求http://127.0.0.1:8000/polls/
那这个url去哪里找呢?
需要在项目mysite的urls.py里面找到
path('polls/', include('polls.urls')),
然后用include函数大法,转移到polls应用的urls中
polls的点代表"拥有"或"名下"的urls.py
那这个urls.py是不自带的,创建polls的时候没有的
需要自己建
到这里就明白了
先用http://127.0.0.1:8000/polls/发射找到这个链接
然后去项目site的urls.py找到path('polls/', include('polls.urls')),
发现在polls.urls中,然后再找到polls下的urls.py
path('', views.index, name='index')
真正调用的是views.index,然后查找polls下的views.py
找到的是index函数
直接用简单粗暴的HttpResponse发射出去这句话。
最后网页效果如图
第四步 给这个polls设置模型(model),也就是设计数据库环节
正常投票应用有
问卷question
选项choice
question包含
问卷描述 question_text
问卷发布日期 question_date
choice包含
选项内容 choice_text
选项得票vote
由于一个问卷包含多个选项,每一个选项必须属于一个问卷
所以choice的外键是question
所有class里面的question_text,question_date
等等都是字段
一个实例实际上是一个record一条记录,记录就是对象本身,类似一个人的
身高体重等。
第五步 给这个polls到项目里面注册一下(或者激活),也就是告诉项目哪里查找运行这个app而已。
在设置里面
polls里面的app信息在app.py中,打开看看
所以
在设置里面配置
第六步,已经注册好安装好配置好app了+数据库model也建好了,就可以迁移了
迁移命令
python manage.py makemigrations polls
这个为什么叫做migration,翻译起来费劲,理解的含义就是migrate是动词,用来读取migration名词里面预先写好的字段,写入数据库,当然这里的数据库系统自带的SQLite
makemigrations就是等价于写好sql语句等待写入数据库中
执行结果:
我们来打开0001_initial.py来看看
# Generated by Django 4.1.5 on 2023-01-11 10:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Question',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question_text', models.CharField(max_length=200)),
('pub_date', models.DateTimeField(verbose_name='date published')),
],
),
migrations.CreateModel(
name='Choice',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('choice_text', models.CharField(max_length=200)),
('votes', models.IntegerField(default=0)),
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),
],
),
]
这里系统帮忙创建了主键id,这个是自增的,也就是id,主键唯一
makemigrations之后创建了可以执行的sql语句,当然这里表现形式还是
class Migration(migrations.Migration):
执行sql语句,就需要动词,migrate了
让我们来一下
所以你能明白为啥 自己创建的字段 要先make migration 一下 ,再migrate一下的原因了。
第七步,既然已创建了应用polls,django强大的地方在于,给你一个可视化的管理后台来管理polls数据库,当然,这里称为admin后台应用(系统自带)
不过,admin此时和polls还没有进行"关联",django官方语言叫做"注册"
也即每一个应用如果需要管理后台可视化来管理的话,先注册一下
打开polls下面的admin.py,注意这个只是取名字叫admin而已,并不是系统后台admin应用
何况这个是空白的,系统admin应用如图
打开polls下面的admin.py,写入注册代码
从数据库模型(model)导入Question,Choice,然后注册到admin后台中
register
第八步:打开后台admin后台看看如何,但是一开始报错,是因为我们没有migrate
那我们先运行python manage.py migrate,这里为啥不要一开始makemigrations一下呢?
因为这些是系统自带的,自带的!自带的就已经提前把migrations安排了,我们用Everything大法查看下
果然
好,继续python manage.py migrate
系统自带应用都写入了数据库中了,也即migrate 了
然后我们打开http://127.0.0.1:8000/admin/继续看看
这里两个事情
- 没有创建过username和password
- 这个模板在哪里,用Everything大法
登录
登录进去后 发现注册是成功的!!