2021-9-27

2-1 路由视图基本使用与关联

路由

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

哪里存在路由?

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

绑定方式:
image.png
首先 import,然后path进行设置,可以选择直接写也可以选择写 include()

视图

views 是 django 的 mvt 中的 v 部分,主要负责处理用户的请求和生成相应内容,然后在页面或者其他类型文档中显示

写法:
image.png

实操

image.png代码结构
首先写视图

  1. #coding:utf-8
  2. # 引入 django 的 http
  3. from django.http import HttpResponse
  4. def index(request):
  5. return HttpResponse('hello django2')

然后写路由
在 app 中新建一个 urls.py

  1. #coding:utf-8
  2. # 引入 django 的 url
  3. from django.conf.urls import url
  4. # 从视图中引入 index
  5. from .views import index
  6. # 然后链接在一起
  7. urlpatterns = [
  8. url('', index)
  9. ]

然后回到根路径下
默认状态:
image.png

  1. ...
  2. # 导入 app 中定义的 url
  3. from app import urls as app_urls
  4. urlpatterns = [
  5. ...
  6. # 引入 path
  7. path('',include(app_urls))
  8. ]

然后 run 一下
在外层 two 下 运行

  1. python manage.py runserver

image.png双绑定(让子路由和副路由绑定,让子路由和子视图进行绑定)显示出来的内容

2-2 url参数设置

url 中的参数

django2 的 url 变量类型

  • 字符串类型:默认类型
  • 整型:匹配0和正整数
  • slug:可理解为注释,后缀或者附属等概念
  • uuid:匹配一个 uuid 格式的对象

支持 url 类型的方法

  • from django.urls import path
    • 是2.0以后的新的方法
  • from django.conf.urls import url
    • 2.0 以前的方法,不支持参数中的类型,只能通过正则表达式来匹配

2.0 之前的匹配规则

image.png

为 url 设置别名

  • path(‘add’,view_function,name=’add’)
    • 其中 add 是路由名,view_function 是回调函数,这里的name就是起的别名

视图读取参数

  • 以 问号 的形式,->request.GET.get(参数名)
  • 以分隔符形式的参数
  • def index(request,参数名,参数名):
    • print(参数名)

读取参数方式1

修改 url 里面的内容 将其改为
http://127.0.0.1:8000/app/?name=demonlb&age=0
即传入 name 和 age 值

  1. def index(request):
  2. # get 中第一个值是获取的key,第二个值置空,则指无默认值
  3. name = request.GET.get('name','')
  4. age = request.GET.get('age', 0)
  5. return HttpResponse('I am {0}, age is {1}'.format(name,age))

并且在 views.py 中 写入以上内容,定义 name 和 age 来接收 url 中的内容

读取参数方式2

修改 app/urls.py
在这里就直接定义了两个参数,并且给出了类型

  1. from django.urls import path
  2. ...
  3. urlpatterns = [
  4. path('<str:name>/<int:age>', index)
  5. ]

然后修改 app/views.py
将第一种方法定义的 name 和 age 删除,从参数中传入 name 和 age

  1. def index(request, name, age):
  2. # get 中第一个值是获取的key,第二个值置空,则指无默认值
  3. # name = request.GET.get('name','')
  4. # age = request.GET.get('age', 0)
  5. return HttpResponse('I am {0}, age is {1}'.format(name,age))

再在浏览器中键入
http://127.0.0.1:8000/app/demonlb/24
就可以了

2021-9-28

2-3 视图的讲解

分为三部分

  • 用户的请求 request
  • 对用户请求的逻辑处理 handler
  • 将处理后的数据返回给用户 response

用户的请求对象 request

  • 浏览器向服务器发送的请求对象,包含用户信息,请求内容和请求方法
  • dir(request) 查看 request 对象的所有方法

常用的 request 对象的方法

  1. request.GET 获取 url 上 ? 后的参数
  2. request.POST 获取 post 提交的数据
  3. request.path 请求的路径, / 后面的所有的值
  4. request.method 请求的方法名,比如 get 或者 post
  5. request.COOKIES
  6. request.user 请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
  7. request.session 既可读又可写的类似于字典的对象,表示当前的会话
  8. request.META 一个标准的Python 字典,包含所有的 HTTP 的首部,具体的头部信息取决于客户端和服务器

    常用的返回对象

  • HttpResponse 可以直接返回一些字符串内容(之前用过)
  • render 将数据在模板中渲染并显示
  • JsonResponse 返回一个 JSON 类型,用于与前端进行 ajax 交互

实操

在 views.py 中将原来写的 index 方法注释了,写一个class,引入 django.views.generic

  1. from django.views.generic import View
  2. class Index(View):
  3. def get(self, request, name, age):
  4. return HttpResponse('I am {0}, age is {1}'.format(name, age))
  5. # def index(request, name, age):
  6. # # get 中第一个值是获取的key,第二个值置空,则指无默认值
  7. # # name = request.GET.get('name','')
  8. # # age = request.GET.get('age', 0)
  9. # return HttpResponse('I am {0}, age is {1}'.format(name,age))

然后修改 urls.py

  1. # from .views import index
  2. from .views import Index
  3. urlpatterns = [
  4. # url('', index)
  5. path('<str:name>/<int:age>', Index.as_view())
  6. ]

最后打印一下 request 的内容

  1. print(dir(request))
  2. ['COOKIES', 'FILES', 'GET', 'META', 'POST', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_current_scheme_host', '_encoding', '_get_full_path', '_get_post', '_get_raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files', '_mark_post_parse_error', '_messages', '_post_parse_error', '_read_started', '_set_post', '_stream', '_upload_handlers', 'body', 'build_absolute_uri', 'close', 'content_params', 'content_type', 'csrf_processing_done', 'encoding', 'environ', 'get_full_path', 'get_full_path_info', 'get_host', 'get_port', 'get_raw_uri', 'get_signed_cookie', 'is_ajax', 'is_secure', 'method', 'parse_file_upload', 'path', 'path_info', 'read', 'readline', 'readlines', 'resolver_match', 'scheme', 'session', 'upload_handlers', 'user', 'xreadlines']

2-4 扩展知识_restul与http介绍

image.png
image.png

2-5 关于豆瓣接口问题说明

image.png
apikey = 0df993c66c0c636e29ecbb5344252a4a

image.png


2-6 项目练习-Django的View、路由参数实践

消息发布和获取

新建文件夹 mkdir lesson3-message_test
然后创建项目 django-admin startproject message_test
进入项目中 cd message_test
创建应用 python manage.py startapp app

然后进入 django-learning/lesson3-message_test/message_test/settings.py
将一些固定的信息改一改

  1. LANGUAGE_CODE = 'zh-hans'
  2. TIME_ZONE = 'asia/Shanghai'

然后固定上节课的格式修改一系列视图和路由的操作
获取路由中问号后的内容:

定义 message 的形式获取

定义一个 message,使用 request.GET.get 方法,第一个参数填写url中的参数,第二个参数填写默认值

  1. # coding:utf-8
  2. from django.http import HttpResponse
  3. from django.views.generic import View
  4. class TestOne(View):
  5. def get(self, request):
  6. message = request.GET.get('message','ok')
  7. return HttpResponse(message)

image.png

使用 restful API 的形式获取

修改 urls.py

  1. ...
  2. urlpatterns = [
  3. path('<str:message>', TestOne.as_view(), name='testOne')
  4. ]

在 views.py 中修改对应的message, get方法中获取 message

  1. class TestOne(View):
  2. def get(self, request, message):
  3. # message = request.GET.get('message','ok')
  4. return HttpResponse(message)