2021-9-27
2-1 路由视图基本使用与关联
路由
- 简单的说, url 就是常说的网址,每个网址代表不同的网页
- 在 django 中 url 也被称为 urlconf
- 每个 url 地址对应一个唯一的 views 视图函数
哪里存在路由?
- 根目录项目中的 urls.py 是根路由,根路由可以集合所有应用的路由
- 每个应用下创建自己的 urls.py ,这个py 属于每个应用的独有路由,通过集成绑定到根路由中进行使用。
绑定方式:
首先 import,然后path进行设置,可以选择直接写也可以选择写 include()
视图
views 是 django 的 mvt 中的 v 部分,主要负责处理用户的请求和生成相应内容,然后在页面或者其他类型文档中显示
写法:
实操
代码结构
首先写视图
#coding:utf-8
# 引入 django 的 http
from django.http import HttpResponse
def index(request):
return HttpResponse('hello django2')
然后写路由
在 app 中新建一个 urls.py
#coding:utf-8
# 引入 django 的 url
from django.conf.urls import url
# 从视图中引入 index
from .views import index
# 然后链接在一起
urlpatterns = [
url('', index)
]
然后回到根路径下
默认状态:
...
# 导入 app 中定义的 url
from app import urls as app_urls
urlpatterns = [
...
# 引入 path
path('',include(app_urls))
]
然后 run 一下
在外层 two 下 运行
python manage.py runserver
双绑定(让子路由和副路由绑定,让子路由和子视图进行绑定)显示出来的内容
2-2 url参数设置
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 之前的匹配规则
为 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 值
def index(request):
# get 中第一个值是获取的key,第二个值置空,则指无默认值
name = request.GET.get('name','')
age = request.GET.get('age', 0)
return HttpResponse('I am {0}, age is {1}'.format(name,age))
并且在 views.py 中 写入以上内容,定义 name 和 age 来接收 url 中的内容
读取参数方式2
修改 app/urls.py
在这里就直接定义了两个参数,并且给出了类型
from django.urls import path
...
urlpatterns = [
path('<str:name>/<int:age>', index)
]
然后修改 app/views.py
将第一种方法定义的 name 和 age 删除,从参数中传入 name 和 age
def index(request, name, age):
# get 中第一个值是获取的key,第二个值置空,则指无默认值
# name = request.GET.get('name','')
# age = request.GET.get('age', 0)
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 对象的方法
- request.GET 获取 url 上 ? 后的参数
- request.POST 获取 post 提交的数据
- request.path 请求的路径, / 后面的所有的值
- request.method 请求的方法名,比如 get 或者 post
- request.COOKIES
- request.user 请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
- request.session 既可读又可写的类似于字典的对象,表示当前的会话
- request.META 一个标准的Python 字典,包含所有的 HTTP 的首部,具体的头部信息取决于客户端和服务器
常用的返回对象
- HttpResponse 可以直接返回一些字符串内容(之前用过)
- render 将数据在模板中渲染并显示
- JsonResponse 返回一个 JSON 类型,用于与前端进行 ajax 交互
实操
在 views.py 中将原来写的 index 方法注释了,写一个class,引入 django.views.generic
from django.views.generic import View
class Index(View):
def get(self, request, name, age):
return HttpResponse('I am {0}, age is {1}'.format(name, age))
# def index(request, name, age):
# # get 中第一个值是获取的key,第二个值置空,则指无默认值
# # name = request.GET.get('name','')
# # age = request.GET.get('age', 0)
# return HttpResponse('I am {0}, age is {1}'.format(name,age))
然后修改 urls.py
# from .views import index
from .views import Index
urlpatterns = [
# url('', index)
path('<str:name>/<int:age>', Index.as_view())
]
最后打印一下 request 的内容
print(dir(request))
['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介绍
2-5 关于豆瓣接口问题说明
apikey = 0df993c66c0c636e29ecbb5344252a4a
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
将一些固定的信息改一改
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'asia/Shanghai'
然后固定上节课的格式修改一系列视图和路由的操作
获取路由中问号后的内容:
定义 message 的形式获取
定义一个 message,使用 request.GET.get 方法,第一个参数填写url中的参数,第二个参数填写默认值
# coding:utf-8
from django.http import HttpResponse
from django.views.generic import View
class TestOne(View):
def get(self, request):
message = request.GET.get('message','ok')
return HttpResponse(message)
使用 restful API 的形式获取
修改 urls.py
...
urlpatterns = [
path('<str:message>', TestOne.as_view(), name='testOne')
]
在 views.py 中修改对应的message, get方法中获取 message
class TestOne(View):
def get(self, request, message):
# message = request.GET.get('message','ok')
return HttpResponse(message)