文章目录
参考项目 :Django快速入门笔记(1)
参考文章 : Django快速入门笔记(1)——我只想简单做个网站
这篇文章还有部署的链接被解放的姜戈08 远走高飞
参考官方文档:
官方使用样例: 编写你的第一个 Django 应用,第 1 部分
可以搜函数的页面: URLconfs 中使用的 django.urls 函数
官方文档首页: Django 文档
cmd中执行以下操作:
django-admin startproject mysite001
- 生成了指定的文件夹mysite001,并且里面包含了一些初始化的文件。
cd进入mysite001:cd mysite001
,然后运行该项目
python manage.py startapp app001
manage.py: 一个命令行实用程序,允许你以各种方式与Django项目进行交互。
它是django-admin的一个小包装,调用manage.py可以非常方便得执行诸如,新建APP,启动服务器等命令,在以后调试的时候我们会经常用到。
更多关于django-admin 和 manage.py的细节在官方文档:django-admin 和 manage.py
2. 在mysite001目录下操作,这里创建子功能app: app001
现在有:
app001,存放指定app的文件夹
mysite001,管理整个web的文件夹,web内容目前包含了一个app001
- 创建2个目录:
md static\app001\
md templates\app001\
其中, static目录用于存放html引入的css类,js类等文件,以及图片,声音等静态文件。 templates用于存放html类文件,同样的为每个app新建一个文件夹。
下面需要将各个组件之间的联系,告诉Django。
打开“\mysite001\mysite001\settings.py
INSTALLED_APPS = [
'app001.apps.App001Config', # 增加app声明
]
- 上面的新增代码段,指出:涉及app001的指令,去到app001文件夹寻找。其中
App001Config.py
是自动生成的.
还有其他很多文件,都是自动添加了.这里就是登记一下配置信息.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS':[os.path.join(BASE_DIR, 'templates/'),],# 新增代码
...
},
]
- 新增代码段解释,告诉Django,templates文件夹位置。
其中,BASE_DIR = Path(__file__).resolve().parent.parent
,也即项目名称.
注意,templates/后面有/,表示是文件夹
TIME_ZONE = 'Asia/Shanghai'
- 修改系统时间为北京(上海)时间
STATIC_URL = '/static/' #(这段已存在)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]# 新增代码
- 新增代码段解释,告诉Django,涉及{% load static %}命令,去static文件夹寻找。
SESSION_ENGINE ='django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS= 'default'
- 将用户信息保存在缓存(也可数据库)
新建”app001/urls.py”
from django.conf.urls import url
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns =[
url(r'^$',views.index1,name='index1'), # 建立地址和视图的关联
]+static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
- 分配到app001的url地址,和 r’^$’ 匹配。符号 $ 表示尾部匹配,再加上符号 ^ (头部匹配),^$表示匹配首页。
- 扩展一下 : 下面是一些解释,可以先不看,直接配置下一个文件。
其中,url函数原型:
def url(regex, view, kwargs=None, name=None):
warnings.warn(
'django.conf.urls.url() is deprecated in favor of '
'django.urls.re_path().',
RemovedInDjango40Warning,
stacklevel=2,
)
return re_path(regex, view, kwargs, name)
url()
函数的功能,path()
也可以实现。(参考文章用Django写出最简单的网页 )区别在于:url
要求使用正则, 而path
的:
from django.urls import path
path('', views.index, name = 'index')
其中,path的原型是:
path(route, view, kwargs=None, name=None)
route:
是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。view:
view 参数是一个视图函数或 as_view() 的结果,用于基于类的视图。它也可以是一个 django.urls.include()。
当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。kwargs:
用于向视图函数或方法传递附加参数。name:
为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。
打开“app001/views.py"
我们在”app001/urls.py”文件中建立了首页与index1视图的关系,但index1视图还未定义。
from django.shortcuts import render
def index1(request): #定义视图index1
ans={} #创建一个字典
ans['head']='hello world' # 赋值
return render(request,'app001/firstpage.html',ans) # 输出字典
代码的含义就是定义一个index1,向’templates/app001/firstpage.html’输出字典ans的值。
- 扩展一下 : 又是一堆解释:,关于render返回HTTPResponse,原型:
def render(request, template_name, context=None, content_type=None, status=None, using=None):
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
那么,为什么要用render而不是直接HTTPResponse? 简单来说,render函数封装了三步: 「载入模板,填充上下文,再返回由它生成的 HttpResponse 对象
」,等价于:
from django.http import HttpResponse
from django.template import loader
def index1(request):
template = loader.get_template('app001/firstpage.html') # 载入模板
ans={} #创建一个字典
ans['head']='hello world' # 赋值
return HttpResponse(template.render(ans, request)) # 填充上下文,并包装成HTTPRes对象
新建 ‘templates/app001/firstpage.html’,编写一个最简单的html
{{head}}
{{}}是Django自带的服务器语言,表示提取双括号内变量的值。这里我们是提取ans[‘head’]的值。
- 扩展一下 : 为什么要使用模板呢?
模板,使用视图,将页面的设计从代码中分离出来。
其中视图,就是一个python函数。用户请求的URL,根据URLconfs映射,来实现对应函数的调用。它做的只有两件事:返回一个包含被请求页面内容的 HttpResponse 对象,或者抛出一个异常。
但是仅这样,页面的设计会被写死在视图函数里。如果你想改变页面的样子,你需要编辑 Python 代码。所以让我们使用 Django 的模板系统,只要创建一个视图,就可以将页面的设计从代码中分离出来。
模板文件就是一个HTML文件,HTML文档参考:HTML 入门
打开“mysite001\mysite001\urls.py”
我们需要对网站的地址(url)进行统一调度
from django.conf.urls import url,include # 增加 include
...
urlpatterns = [
url(r'^app001',include('app001.urls')), # 增加对应关系
...
]
r’^app001’,符号 ^ 表示头部匹配。 整段语句表示,若网站地址为"http://XXXXX/app001……" ,则该地址分配到"app001/urls.py"文件来处理。
函数 include() 允许引用其它 URL映射,include(‘app001.urls’)即表示,将使用app001.urls.py
文件中的映射进行下一步匹配。
其理念是可以即插即用。使用时机:当包括其它 URL 模式时你应该总是使用 include() , admin.site.urls 是唯一例外。
参考官网文档:编写你的第一个 Django 应用,第 1 部分
运行
python manage.py runserver
- 默认情况下,runserver 命令会将服务器设置为监听本机内部 IP 的 8000 端口 。
用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍 Python 代码。所以你不需要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,比如添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。 - 在浏览器地址栏输入地址
http://127.0.0.1:8000/app001
总结
urls 负责 分配网页地址给views
views负责 传递变量给templates
templates收到变量值,展示给访客
更多可参考:Django快速入门笔记(2)