上一个入门计划1就是简单的安装以及了解一下Django,可能是进去了个脚趾头,现在继续往里面迈
项目与应用
我们在入门计划1里面创建了一个项目叫做django_HelloWorld,从理论上来说我们现在就可以用这个项目的框架直接写我们的网站了,但是这样写出来的网站逻辑可能不太清晰,例如存数据库的逻辑与处理数据的代码写在一起了,不方便以后的代码维护以及交接,所以在这里就要用到Django的应用这一概念了。首先要了解一下项目和应用的关系,总体来说就是一个项目里面可以有多个应用,这些应用各自完成一块工作,项目将他们合并起来成为一个网站,当然一个应用也可以在多个项目中我们在与mange.py同级的文件夹中使用python manage.py startapp polls
来创建我们的第一个应用polls,(方便我们直接import)我们可以看到Django很贴心的为我们创建好了目录结构:
现在我们就可以在polls文件夹中的views.py里面写上我们的代码了,在里面写入:
from django.http import HttpResponse
def hello(request):
return HttpResponse("hello world i'm studying django")
之后我们在polls里面创建一个urls.py,这个文件和外面的一样也是记录路由关系的,只不过外面的是记录整个项目的,这个仅仅是记录这个应用的,在urls.py里面添加
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello),
]
再在整个的项目的urls.py中添加
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/',include('polls.urls')),
path('admin/', admin.site.urls),
]
之后我们python manage.py runserver 5555
在5555端口开启服务,访问127.0.0.1:5555/polls/hello,可以看到如下图片:
页面上成功的显示了我们hello函数中返回的文字,现在我们来研究一下为什么它能够返回,首先我们知道urls.py中存放的是路由关系,我们看项目的urls.py,通过观察可以看到,是path函数将url与view函数的具体逻辑联系在一起的。path()函数一共可以有四个参数,分别是
- route
-
- route是一个包含url模式的字符串,当Django收到一个请求的时候,他会从第一个url模式开始,一个一个的向下找,知道找到一个能与之匹配的模式。这个搜索不包括参数以及域名,例如127.0.0.1/hello与127.0.0.1/hello?page=3,都会匹配到hello对应的view函数
- view
-
- 当django找到了一个匹配的模式串之后,他将调用对应的view函数,将一个 HttpRequest对象作为第一个参数,并且url中的任何参数都作为其中的key值。
- kwargs
-
- 一个传给view函数的字典,应该用不上
- name
-
- 给这个url起个名,方便在Django的任何地方都能以这个名字为参考
此外我们还要注意其中的个include()函数,这个函数是引用其他urls.py文件的。每当Django遇到包括include(),它砍掉匹配到该点的URL的任何部分,并发送剩余的字符串到引用的urls.py做进一步处理。
数据库与安装应用
对于数据库的处理有两种,一种是使用Django的settings.py配置数据库,另一种是自己写一个database的应用来彻底接管数据库,虽然我个人更加倾向于第二种方法,但是既然是学Django那还是按照文档来,看看Django的方法吧
打开settings.py我们可以看见里面有如下代码:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
这是Django默认的数据库设置,其中ENGINE代表我们要使用的数据库引擎,SQLite3是python自带的数据库,不需要额外下载,但是一般的情况下我们都是用mysql数据库,所以我们将数据库格式改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_helloworld',
'HOST':'',
'PASSWORD': 'xxxxxx',
'USER': 'root',
}
}
之后我们查看INSTALLED_APPS字段这个字段里面的内容是我们将要在这个项目中使用的应用,这些应用具体是干什么的可以查看Django的文档
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
之后使用python manage.py migrate
进行数据库的迁移,这个命令会查看INSTALLED_APPS中的应用并在DATABASES字段设置好的数据库中建立所需要的表。对于我们自己的应用,Django也提供了方便的定义数据表的方式,我们在polls文件夹中的models.py文件并输入如下代码:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
可以看出来,django.db.models这个类中对数据库列的命名还是比较友好的。
在数据库的准备工作完成之后我们可以将我们的polls应用安装到项目中去了,我们需要在INSTALLED_APPS中添加一个polls项目的配置类,这个配置类PollsConfig在polls/app.py中,添加后的代码如下;
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
之后执行python manage.py makemigrations polls
这个命令将告诉Django你对models做了一些修改,并且Django会将这些修改存为polls/migrations/0001_initial.py文件方便我们日后查看以及手动调整,之后我们可以通过python manage.py sqlmigrate polls 0001
查看这次修改数据库要使用的sql语句,也可以直接再一次执行python manage.py migrate
更新数据库