Django 路由器 & 视图 [2]

2 阅读4分钟

一、路由器

1、概念

  • 简单的说,url 就是常说的网址,每个网址代表不同的网页
  • 在 django 中,url 也称为 urlconf
  • 每个url地址对应一个唯一的 views 视图函数

2、哪里有路由?

  • 根目录中的 urls.py是根路由,根路由可以集合所有应用路由
  • 每个应用下创建自己的 urls.py,这个 urls.py属于每个应用的独有路由,通过集成到根路由中使用

3、绑定路由

项目路由绑定应用路由的写法,是在项目 urls.py中写的;


# 导入 admin 功能模块
from django.contrib import admin

# 导入 url 编写模块
# include 将应用中的urls包含进来
from django.urls import path,include

# url集合 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('demoapp.urls'))		# 【区别】直接导入的
]
# 导入 admin 功能模块
from django.contrib import admin

# 导入 url 编写模块
from django.urls import path,include

# 导入 demoapp 应用的 urls 并命名为 demoapp_urls
# 【区别】先导入,再引用
from demoapp import urls as demoapp_urls

# url集合 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(demoapp_urls))			# 【区别】
]

二、创建视图步骤

1、创建视图文件
from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello Dajngo')
2、创建应用urls 文件
#coding:utf-8

# 用新的写法,按照项目 urls.py 中的写法写
from django.urls import path

# 引入视图
from .views import index

urlpatterns = [
    path('', index)
]
3、应用注册别忘了
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'demoapp'
]
4、项目中的 urls.py绑定 应用中的urls.py
# 导入 demoapp 应用的 urls 并命名为 demoapp_urls
from demoapp import urls as demoapp_urls

# url集合 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('demoapp/', include(demoapp_urls))
]
5、启动
# 启动命令行
python manage.py runserver

# 访问
http://127.0.0.1:8000/demoapp/
python manage.py runserver 0.0.0.0:9999
项目下的 settings.py 文件下

# 白名单
ALLOWED_HOSTS = ['*']

说明:
# 允许所有主机
ALLOWED_HOSTs = ['*']

# 指定单个主机名
ALLOWED_HOSTS = ['www.yourwebsite.com']

# 指定多个主机名
ALLOWED_HOSTS = ['www.yourwebsite.com', 'yourwebsite.com', 'sub.yourwebsite.com']

# 响应环境变量
import os
ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', 'localhost').split(',')

三、路由参数

1、query 参数
http://127.0.0.1:8000/demoapp/?name=gognxin&age=26

def index(request):
    name = request.GET.get('name', '默认姓名')
    age = request.GET.get('age', 18)
    return HttpResponse(f'姓名: {name},年龄: {age}')
    # return HttpResponse('姓名: {0},年龄: {1}'.format(name, age))
    # 注意:是通过 . 调用

显示:
姓名:gognxin,年龄:26
【访问路径】
http://0.0.0.0:5203/demoapp/testone?message=test

【views.py 文件】
from django.views.generic import View
from django.http import HttpResponse

class TestOne(View):
    def get(self, request):
        message = request.GET.get('message', '没有message参数')
        return HttpResponse(f'参数:{message}')

【urls.py 文件】
from django.urls import path
from .views import TestOne
urlpatterns = [
    path('testone', TestOne.as_view(), name='testOneName')
]
2、路径参数
http://127.0.0.1:8000/demoapp/gognxin/26

# 1、先修改 应用 的 utls.py,定义接收的参数
urlpatterns = [
    path('<str:name>/<int:age>', index)
]

# 2、views.py 接参数
def index(request, name, age):
    return HttpResponse(f'姓名: {name},年龄: {age}')
【访问路径】
http://0.0.0.0:5203/demoapp/testone/message_value

【views.py 文件】
from django.views.generic import View
from django.http import HttpResponse

class TestOne(View):
    def get(self, request, message):
        return HttpResponse(f'参数:{message}')

【urls.py 文件】
from django.urls import path
from .views import TestOne

urlpatterns = [
    path('testone/<str:message>', TestOne.as_view(), name='testOneName')
]

四、基于对象的视图创建步骤

1、视图文件

#coding:utf-8

# 引入基础的视图类 View
from django.views.generic import View
from django.http import HttpResponse

class Index(View):
    
    # 在 Django 基于类的视图中,方法名 get\post\put\delete 等具有特殊含义,直接对应http协议中的请求方式
    def get(self, request, name, age):

        # dir() 用来列出一个对象的所有属性和方法
        print(dir(request))

        return HttpResponse(f'姓名: {name},年龄:{age}')

2、路由 应用级的utls.py

#coding:utf-8

# from django.conf.urls import url

from django.urls import path

from .views import Index

urlpatterns = [
    # as_view() 用于将基于类的视图 转换为可以被Django路由系统调用的视图函数
    path('<str:name>/<int:age>', Index.as_view())
]

3、访问

http://127.0.0.1:8000/demoapp/gongxin/25

五、修改编码和时区【配置修改】

项目创建完成后,修改项目的配置文件 DemoDjango6/DemoDjango6/settings.py

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

六、[附] 常用的 request 方法

# 获取路径上的查询参数
request.GET

# 获取POST 提交的数据
request.POST

# 请求的路径,比如 127.0.0.1/test/1  那就返回 /test/1
request.path

# 请求的方法 比如 get\post
request.method

# 请求过来的 cookies
request.COOKIES

# 请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
request.user

# 一个可读可写的类似字典的对象,表示当前会话
request.session

# 包含所有的HTTP首部信息
request.META

七、[附] 常用的返回对象

# 可以直接返回一些字符串内容
HttpResponse
from django.http import HttpResponse

# 将数据在模板中渲染并显示
render
from django.shortcuts import render

# 返回一个json数据
JsonResponse
from django.http import JsonResponse

八、 [附] url 变量类型

<str:name> 字符串类型,匹配任何非空字符串,但不包括斜杠,在不指定类型的前提下,默认字符串类型

<int:age>整型,匹配 0 和 正整数

<slug:day>注释、后缀、附属 等概念

<uuid: uid>匹配一个 uuid 格式的对象,类似 xxx-xx-xx

虚拟环境 Virtualenv

python 的虚拟环境的包,为了解决同一台电脑中,有多个python版本的项目,比如有的项目是 python2.7

有的是python3.6,解决不同版本之间,环境变量相互污染的问题

python virtualenv

2-2 已经看完