创建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

创建项目后,目录结构如下:

目录说明:

  • HelloWorld:   项目的容器。
  • manage.py:    一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • HelloWorld/__init__.py:     一个空文件,告诉 Python 该目录是一个 Python 包。
  • HelloWorld/asgi.py:          一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
  • HelloWorld/settings.py:   该 Django 项目的设置/配置。
  • HelloWorld/urls.py:          该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • HelloWorld/wsgi.py:         一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
# 启动服务
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 文件代码,修改:

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',		#管理站点
    'django.contrib.auth',		#认证系统
    'django.contrib.contenttypes',	#用于内容类型的框架
    'django.contrib.sessions',		#会话框架
    'django.contrib.messages',		#消息框架
    'django.contrib.staticfiles',	#管理静态文件框架
    'helloApp'         # 添加新的应用名
]

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>

 

posted on 2022-07-20 23:16  云初见  阅读(138)  评论(0编辑  收藏  举报