Django框架1

  • 建立工程能够使用命令:django-admin startproject 工程名称
  • 固然也能够使用ide直接建立一个Django工程
  • 新建的工程能够直接运行python manage.py runserver来开启
  • Django一样是MVT模式,须要模型、路由视图和模板
  • 建好工程后如要新建一个子模块应用,能够使用命令:python manage.py startapp 子应用名称
  • 一样子应用的相关文件已经自动建好,可是须要手动添加一个urls.py文件用来写入路由
  • 建立好子应用后一样应该和Flask同样注册到主模块中去,这里将子应用下的apps.py里的UserConfig添加到主模块的settings.py里的INSTALLED_APPS列表里
  • 配置好后便可开始写路由和视图函数,这里视图函数在views.py内写入,须要注意的是该框架视图函数均需传入request对象:
from django.http import HttpResponse
def index(request):
    #这里的request对象为框架自动构造,可是response则需开发者构造
    return HttpResponse("hello the world!")
  • 而后在urls.py文件内写入路由,路由文件内是一个名为urlpatterns的列表,这里和Flask不一样,不使用装饰器,而是将全部路由放入一个单独的文件中:
from django.conf.urls import url
from . import views
    #这里一样须要将视图函数导入
urlpatterns = [
    #这个匹配到的路径对应该视图函数
    url(r'^index/$', views.index),
]
  • 同时这里的路由也要注册到主模块的路由中,在主模块的urls.py文件的urlpatterns列表中写入路由:
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),  # django默认包含的
    # 添加子模块的路由,这里将包含子模块中的全部路由,因此该user模块的访问路径为协议://域名:端口/user/子模块下的具体地址,拿到url后首先匹配路径user/(这里自动忽略第一个/),匹配到后根据include找到子模块的urls,再根据子模块的路由去执行对应的视图函数,这也决定了user模块下的全部路由均以/user/开头,因此这里要访问index的完整路径为/user/index
    url(r'^user/', include('user.urls')), 
]
  • 配置文件settings.py
    • BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(_file_))) 定位当前工程的根目录
    • DEBUG
    • 语言:LANGUAGE_CODE = 'en-us' 这里能够改成中国中文:LANGUAGE_CODE = 'zh-hans'
    • 时区:TIME_ZONE = 'UTC' 这里一样能够更改:TIME_ZONE = 'Asia/Shanghai'
  • 请求路径及request携带参数提取:
    • 请求路径直接携带:如:http://xxxx:80/news/100 能够在路由中使用正则提取:url(r'^news/(\d{3})/$', views.news),将表达式用括号括起,此时再定义视图函数时则须要接收request对象和该匹配值,该值也能够取个名字:url(r'^news/(?P<id>\d{3})/$', views.news) 将?P <名字> 放在前面便可
    • 获取请求路径中的查询字符串参数,如:http://xxxx:80/news/?id=100 这里直接使用request.GET.get('id')获取
    • 获取请求体中携带的表单参数,能够使用request.POST.get('id')获取
    • 获取请求体中非表单类型参数,如json,使用request.body获取,可是返回值为byte类型,须要转换,如json: json.loads(request.body.decode()).get(id)
    • 获取请求头的各类数据:如:request.META['CONTENT_TYPE']
  • 类视图
    • Django中能够以一个类来定义视图函数,这就是类视图
    • 使用类视图能够将视图对应的不一样请求方式(如get,post)以类中的不一样方法来区别定义
    • 而且类是能够继承的,这就有了更好的复用性
    • 类视图中定义的函数名只能是请求的小写,如get,post
    from django.views.generic import View
    class RegisterView(View):
    #注册类,这里须要继承View,以在配置路由时使用as_view()方法
      def get(self, request):
          """处理GET请求,返回注册页面"""
          return render(request, 'register.html')
      def post(self, request):
          """处理POST请求,实现注册逻辑"""
          return HttpResponse('这里实现注册逻辑')
    • 路由配置
    urlpatterns = [
      # 视图函数:注册
      # url(r'^register/$', views.register),
      # 类视图:注册
      url(r'^register/$', views.RegisterView.as_view()),
    ]
  • 类视图装饰器
    • 使用method_decorator将装饰器直接定义在类上,传入自定义装饰器名和指明name(类视图中的方法名)便可
    • 在子模块下新建一个decorator.py文件,写入自定义装饰器,并在视图函数中导入
    # 这里指明将装饰器dec_view给get函数使用,这里也能够将@method_decorator(dec_view)直接加到要装饰的方法上,如要给全部请求加此方法,则用name='dispatch'
    @method_decorator(dec_view, name='get')
    class register(View):
      def get(self,request):
          return HttpResponse('getRequest')
      def post(self,request):
          return HttpResponse('postRequest')
    • 也能够将装饰器直接在路由文件中调用:
    urlpatterns = [
      url(r'^register/$', dec_view(views.RegisterView.as_view())),
    ]
  • 中间件
    • 同Flask的钩子函数,在响应前或响应后执行
    • 定义中间件的形式同装饰器
    • 在子模块下新建一个middleware.py文件,写入中间件函数
    def test_middleware(re_view):
      def middleware(request):
          print('响应前执行')
          # 这里时真正响应的视图函数
          response = re_view(request)
          print('响应后执行')
          return response
      return middleware
    • 将函数注册到settings.py文件中的MIDDLEWARE列表中,这里是'user.middleware.test_middleware'
    • 若有多个中间件执行顺序和一个函数上面加多个装饰器的顺序相同
相关文章
相关标签/搜索