创建Django项目
一、创建项目
1. 环境准备:
cmd命令安装:
pip install django
pip show django # 成功显示版本号表示安装成功
注:如果要使用xadmin,需安装2.x版本,如pip install django==2.2.6
2. 创建项目
安装 Django 之后,就有了可用的管理工具 django-admin.py,Windows如果没有配置环境变量可以用 django-admin。
创建项目:在cmd窗口 或 pycharm的Terminal窗口都可以。
# cd到要创建项目的目录。注意windows10:cd /d E:\PyCharm\Archer
cd E:\PyCharm
# 创建项目
django-admin.py startproject HelloWorld
#进入项目目录,查看目录结构
cd HelloWorld/
tree
创建项目后,目录结构如下:
目录说明:
|
# 启动服务
python manage.py runserver
# django服务默认在8000端口启动,想换个端口,可以:
python manage.py runserver 8080
# 0.0.0.0 让其它电脑可连接到开发服务器
python manage.py runserver 0.0.0.0:8000
在浏览器输入你服务器的ip及端口号(本机IP地址:127.0.0.1:8000),可正常启动页面。
3. 视图和URL
在HelloWorld项目的HelloWorld目录新建一个views.py文件,并输入代码:
HelloWorld/HelloWorld/views.py 文件代码:
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world!")
接着,绑定URL与视图函数:打开urls.py文件,删除原代码,输入如下代码:
HelloWorld/HelloWorld/urls.py 文件代码:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$',views.hello)
]
启动Django开发服务器,浏览器访问http://127.0.0.1:8000,可打开views.hello页面,页面展示Hello world!
也可以修改以下规则:
HelloWorld/HelloWorld/urls.py 文件代码:
rom django.urls import path
from . import views
urlpatterns = [
path('hello/',views.hello)
]
通过浏览器打开http://127.0.0.1:8000/hello,可打开views.hello页面,页面展示Hello world!
3.1 URL配置之path()函数、re_path()函数、url()函数
django版本多,有path()、re_path()、url()三种写法,区别如下:
- path() 只能绝对匹配路径地址,不支持正则匹配
- re_path() 支持正则匹配,dajango 1.x版本常用
- url() 支持正则匹配,实际上就是return re_path,django 2.x版本推荐
path()可以接收四个参数,分别是2个必选参数:route、view, 2个可选参数:kwargs、name
语法格式:
path(route, views, kwargs=None, name=None)
- route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。
- view: 用于执行与正则表达式匹配的 URL 请求。
- kwargs: 视图使用的字典类型的参数。
- name: 用来反向获取 URL。
url() 与path() 的语法一样。2个必选参数:route、view,2个可选参数:kwargs、name。
# 参考url()函数源码,可以看出url()函数就是调用了re_path()方法:
def url(regex, view, kwargs=None, name=None):
return re_path(regex, view, kwargs, name)
Django2.0中可用re_path()方法来兼容1.x版本中的url()方法,一些正则表达式的规则也可通过re_path()来实现
3.2 多个URL配置
urlpatterns里面url(r'^$',view.index)这项是打开首页http://127.0.0.1:8000,平常网站会有多个页面,如想加个页面地址http://127.0.0.1:8000/archer打开另一个页面
# HelloWorld/HelloWorld/views.py 文件代码:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello world!圣杯战争~~")
def archer(request):
return HttpResponse('Archer!天秤守护者~~')
# HelloWorld/HelloWorld/urls.py 文件代码:
rom django.conf.urls import url
from . import views
urlpatterns = [
url('^$',views.index),
url('^archer$',views.archer)
]
在浏览器输入地址http://127.0.0.1:8000/打开页面出现:Hello world!圣杯战争~~
在浏览器输入地址http://127.0.0.1:8000/archer打开页面出现:Archer!天秤守护者~~
二、创建应用
1. 新建应用
上面通过django-admin startproject helloworld是创建项目,一个项目下可以有多个应用(APP)。
# cd 到 manage.py 所在的目录(项目目录),输入命令:
python manage.py startapp helloApp
# 新建成功后,目录结构如下:
setting配置 新建应用后,一定要在setting.py文件里,把刚新建的应用名称添加到INSTALLED_APPS里,不然无法识别到新应用 # HelloWorld/HelloWorld/setting.py 文件代码,修改:
|
2. 模板与html页
上面使用django.http.HttpResponse()来输出"Hello world!",该方式数据与视图在一起,不符合Django的MVC思想。Django模板是一个文本,用于分离文档的表现形式和内容。
templates模板
在helloApp目录下新建一个templates包,包里新建一个demo.html文件,写入以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo页面样式</title>
</head>
<body>
<h4>欢迎来到乱古时代</h4>
<hr>
<h4>你将见证荒天帝的传奇</h4>
<p>最黑暗最混乱的年代,史上最大的清算,杀到世上无人敢称尊。</p>
</body>
</html>
视图与URL
html的内容页面有了,接下来就是让他在指定的url地址上展示出来了
# 在helloApp/views.py 里写视图函数:
from django.shortcuts import render
# Create your views here.
def demo(request):
return render(request,'demo.html')
# 在HelloWorld/urls.py 里添加url访问路径:
from django.conf.urls import url
from . import views
from helloApp import views as view #引入文件名同名,可重命名
urlpatterns = [
url('^$',views.index),
url('^archer$',views.archer),
url('^demo$',view.demo) #添加的访问路径
]
注:匹配路径统一在后面加 / ,前面不用加 / ,如:index/ demo/ demo/page
接下来在浏览器输入地址:http://127.0.0.1:8000/demo就能访问到demo.html页面了
浏览器访问一个网页是通过url地址去访问的,django管理url配置是在urls.py文件。当一个页面数据很多时,就会有翻页,页数是不固定的,如page=1,也就是url路径里带参数。
url加变量
#当访问页面有分页的情况,对应的页数就不能写死,如访问
http://127.0.0.1:8000/demo/page=1 ,就不能这么写死: url('^demo/page=1$',view.demo)
若想匹配任意的页数,前面的部分 demo/page= 不变,匹配任意数字,可用正则 \d+ 匹配
url('^demo/page=\d+$',view.demo)
这样在浏览器上输入任意page页数都能访问一个固定地址,依然不是我们希望的结果。我们希望不同的页数,访问不同的地址,于是可写个带参数的视图函数
# helloApp/views.py 文件写个带参数的视图函数,当输入的page=后面不是数字就抛异常404
# helloApp/views.py 文件:
from django.shortcuts import render
from django.http import HttpResponse,Http404
# Create your views here.
def index(request):
return HttpResponse("Hello World! 圣杯战争~")
def demo(request):
return render(request,"demo.html")
def page(request,num):
try:
num = int(num)
return render(request,"demo.html")
except:
raise Http404
# HelloWorld/urls.py 文件:
from django.conf.urls import url
from django.urls import re_path,path
from . import views
from helloApp import views as view #引入文件名同名,可重命名
urlpatterns = [
path('index/',views.index),
re_path('^$',views.index),
url('^demo$',view.demo),
url('^demo/page=(\d+$)',view.page) # 使用page视图函数
]
接下来浏览器输入:http://127.0.0.1:8000/demo/page=222 能访问到demo.html页面,视图函数返回的是一个静态的demo.html模板页面。
如果输入的page不是数字,如:http://127.0.0.1:8000/demo/page=aa 会出现报错页面:Page not found (404)
这种报错页面,是因为Django设置文件setting.py里面有个参数DEBUG=True,将其改为False,Django将显示标准的404页面。
# DEBUG改成False之后,需要重启服务,同时需加个ALLOWED_HOSTS地址,如:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ["127.0.0.1"]
执行:python manage.py runserver重新启动后,出现的404页面就是标准的了:Not Found
获取url参数和name的作用
如打开博客园按时间分类标签页 https://www.cnblogs.com/rider-zhou/archive/2022/06.html 里面的时间参数是动态的,想获取时间参数2022和06,就涉及到url参数的获取。
获取url
先用path去匹配一个url地址,类似于archive/2022/06.html,于是取2个参数名称year,month。参数用<name>这种格式。
# HelloWorld/urls.py 文件:
from django.conf.urls import url
from django.urls import re_path,path
from . import views
from helloApp import views as view #引入文件名同名,可重命名
urlpatterns = [
path('archive/<year>/<month>.html',view.home)
]
# helloApp/views.py 文件:
from django.shortcuts import render
from django.http import HttpResponse,Http404
# Create your views here.
def home(request,year='2018',month='10'):
return HttpResponse("获取当前页面home的时间标签:%s年%s月"%(year,month))
启动服务后,浏览器输入:http://127.0.0.1:8000/archive/2022/02.html,页面展示:获取当前页面home的时间标签:2022年01月
正则匹配url
上面虽然可以实现从url获取参数,但有问题:年和月都可以输入各种数据,如archive/2022/101.html,就不合理。
若想让year参数只能是4个数字,month参数只能是2个数字,就要用到正则匹配了。
- r 是raw原型,不转义
- ^ 匹配开始
- $ 匹配结束
- ?P 参数year
- [0-9] 匹配0到9的数字
- {4} 匹配4个数字 {1,2} 匹配1到2个数字
# HelloWorld/urls.py 文件:
from django.conf.urls import url
from django.urls import re_path,path
from . import views
from helloApp import views as view #引入文件名同名,可重命名
urlpatterns = [
path('archive/<year>/<month>.html',view.home),
url('^archive2/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2}).html$',view.home2)
]
# helloApp/views.py 文件:
from django.shortcuts import render
from django.http import HttpResponse,Http404
# Create your views here.
def home(request,year='2018',month='10'):
return HttpResponse("获取当前页面home的时间标签:%s年%s月"%(year,month))
def home2(request,year='2016',month='12'):
return HttpResponse("获取当前页面home2的时间标签:%s年%s月"%(year,month))
启动服务后,archive的month输入任意数都可以,http://127.0.0.1:8000/archive/2018/1222.html
archive2的month输入1位数也可以,输入3位数就不行 http://127.0.0.1:8000/archive2/2028/2.html
urls.py 文件中定义name的作用
如果有一个home.html页面,还有个demo.html页面,之前是独立不相干的,现在要从home.html页,点个按钮,跳转到demo.html页:
# helloApp/templates/home.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home页面</title>
<base href="http://127.0.0.1:8000/" target="_blank">
</head>
<body>
<p>终于等到你,岁月长河在此<br><br>
<a href="demo/">点击这里到乱古时代</a>
</p>
</body>
</html>
# helloApp/templates/demo.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo页面样式</title>
</head>
<body>
<h4>欢迎来到乱古时代</h4>
<hr>
<h4>你将见证荒天帝的传奇</h4>
<p>最黑暗最混乱的年代,史上最大的清算,杀到世上无人敢称尊。</p>
</body>
</html>
# helloApp/views.py 文件:
from django.shortcuts import render
from django.http import HttpResponse,Http404
# Create your views here.
def home(request):
return render(request,'home.html')
def demo(request):
return render(request,'demo.html')
# HelloWorld/urls.py 文件:
from django.conf.urls import url
from django.urls import re_path,path
from . import views
from helloApp import views as view #引入文件名同名,可重命名
urlpatterns = [
url('^demo/$',view.demo),
url('^home/$',view.home)
]
这样就可以实现在home页点 点击这里到乱古时代 跳转到demo页面。
如果在页面里把url地址写死了<a href="demo/">点击这里到乱古时代</a> ,有个弊端,后续地址变了不好维护。
为了url地址维护起来方便,可以给他取个唯一的名称,也就是name参数,接下来在url配置里加个name名称。
# HelloWorld/urls.py 文件:
from django.conf.urls import url
from django.urls import re_path,path
from . import views
from helloApp import views as view #引入文件名同名,可重命名
urlpatterns = [
url('^demo/$',view.demo,name='demo_page'),
url('^home/$',view.home,name='home_page')
]
# helloApp/templates/home.html 文件:修改跳转地址
<a href="{% url 'demo_page' %}">点击这里到乱古时代</a>