在路由urls.py文件中
# \d => [0-9], 之后加上加好代表至少一个,一个到多个的意思 # url(r'^index/\d+', views.index) #这种语法在index/之后最少也要加上一个数字才能查到返回值,不加数字查不到方法的返回值。 # url(r'^index/(\d+)', views.index), #index/后面匹配的参数条件用小括号括起来,相应的在视图函数中的函数方法中必须多传一个形参,可以用来获取index/后面输入的值 def index(request, xxx): print(xxx) return HttpResponse("index") # 无名分组就是将路由后面匹配的参数用小括号括起来,以位置参数的形式传递给视图函数
# 给无名分组用?P<aaa>在括号内起了个aaa的名字,在此起的名字必须跟视图函数中所多传的形参名字一样 # url(r'^test/(?P<aaa>\d+)', views.test), def index(request, aaa): print(aaa) return HttpResponse("index") # 有名分组就是将路由后面匹配的参数用小括号括起来,以关键字参数的形式传递给视图函数
# url(r'^test1/', views.home, name='xxx'), # 给路由起个别名 # 就是用一个方法得到一个结果,这个结果就是路由名对应的路径
url(r'^test1/(\d+)', views.home, name='xxx'), # 给路由起个别名 # python中反向解析 def home(request): # 参数传递路由名称 # reverse('xxx') => /test1/111 # /test1/1 # /test1/122222 print(reverse('xxx',args=(122222, ))) return HttpResponse('home') # 前端解析 <a href="{% url 'xxx' 123 %}">1111111</a>
url(r'^test2/(?P<year>\d+)', views.home, name='z'), # 给路由起个别名 # python中反向解析 def home(request): # 参数传递路由名称 # reverse('xxx') => /test1/111 # /test1/1 # /test1/122222 print(reverse('z',kwargs={'year':2021})) return HttpResponse('home') # 前端解析 <a href="{% url 'xxx' 123 %}">1111111</a>
# 总路由就不再写路由与视图函数的对应关系, 用来识别当前路由属于哪一个应用 from django.conf.urls import url,include # 需要导入include模块 # 第一种方式 from app01 import urls as app01_urls from app02 import urls as app02_urls from app01 import views urlpatterns = [ url(r'app01/', include(app01_urls)), url(r'app02/', include(app02_urls)), ] # 强调:总路由中,最后面千万不能加$ # 第二种方式 urlpatterns = [ url(r'app01/', include('app01.urls')), url(r'app02/', include('app02.urls')), ]
# json格式的数据有设么用? 实现前后端数据交互的一种数据格式,实现跨语言之间的通信 from django.http import JsonResponse import json def a_json(request): user_dic = {'name': 'ly洋哥很帅', 'age': 18} l = [1, 2, 3,4] # res = json.dumps(user_dic, ensure_ascii=False) # res = JsonResponse(user_dic, json_dumps_params={'ensure_ascii': False}) res = JsonResponse(l,safe=False) return HttpResponse(res)
request.method request.GET.get() request.GET.getlist() request.POST.get() request.POST.getlist() def func(request): # 上传文件必须做的两件事: # 1. 请求方式改成post # 2. 改enctype=multipart/form-data # print(request.POST) # <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 123.png (image/png)>]}> # print(request.FILES.get('myfile')) """ /app01/func/ /app01/func/ /app01/func/ /app01/func/ /app01/func/ /app01/func/?name=ly :param request: :return: """ print(request.path) print(request.path_info) print(request.get_full_path()) return render(request, 'func.html')
FBV 基于函数的视图 CBV 基于类的视图 # 基本使用 from django.views import View class MyView(View): def get(self,request): return HttpResponse("get方法") def post(self,request): return HttpResponse("post方法") url(r'^func4',views.MyView.as_view()) """为什么能够自动根据请求方法的不同执行不同的方法""" 1.突破口 as_view() 2.CBV与FBV路由匹配本质 url(r'^func4',views.MyView.as_view()) # 等价 CBV路由配置本质跟FBV一样 # url(r'^func4',views.view) 3.源码 def as_view(cls, **initkwargs): def view(request, *args, **kwargs): self = cls(**initkwargs) # self = MyView() 生成一个我们自己写的类的对象 return self.dispatch(request, *args, **kwargs) return view def dispatch(self, request, *args, **kwargs): # 获取当前请求并判断是否属于正常的请求(8个) if request.method.lower() in self.http_method_names: # get请求 getattr(对象,'get') handler = 我们自己写的get方法 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) # 执行我们写的get方法并返回该方法的返回值