5,Vue-vuex和axios-restful规范

5,Vue-vuex和axios-restful规范vue

vue项目:-- npm install @vue/cli -g-- 新建目录-- vue create 项目名称-- 测试启动项目 npm run serve-- npm i element-ui-- npm i vue-router-- 注册路由-- 新建router.js-- 导入vue 以及vue-router-- Vue.use(VueRouter);-- export default new VueRouter({routes: []})-- 在main.js 中导入 new VueRouter 的实例化对象-- 注册到Vue实例化对象中 ios

 

vuex就是一个,来协助公共通讯的,面试

 

 

能够在一个空目录下建立,vue-router

vue项目:
        -- npm install @vue/cli -g
        -- 新建目录
        -- vue create 项目名称
        -- 测试启动项目 npm run serve
        -- npm i element-ui
        -- npm i vue-router
        -- 注册路由
            -- 新建router.js
            -- 导入vue 以及vue-router
            -- Vue.use(VueRouter);
            -- export default new VueRouter({
                routes: []
            })
            -- 在main.js 中导入 new VueRouter 的实例化对象
            -- 注册到Vue实例化对象中

 

整理笔记vuex

Vuex
        -- 集中式状态管理架构
        -- 配置
            -- npm install vuex 
            -- import vuex from "vuex"
            -- Vue.use(vuex)
            -- let store = new vuex.Store({
                    state: {
                        xxx: xxx
                    },
                    getters: {
                        xxx: function(state, getters){
                            return 处理后的数据
                        }
                    },
                    mutations: {}
            })    
            -- const app = new Vue({
                el: "#app",
                store: store
            })
        -- 获取vuex中的数据
            -- this.$store.state.xxx
            -- this.$store.getters.xxx
        -- 更改vuex中的数据
            -- this.$store.commit("事件名称",data)
            -- mutations: {
                "事件名称": function(state, data){
                        state.xxx = data
                }
            }
    Axios
        -- 配置
            -- npm install axios
            -- import axios from "axios"
            -- Vue.prototype.$axios = axios
        -- this.$axios.request({
            url: "api....",
            method: "get",
            data: {},
            params: {}
        }).then(function(data){
            注意this
        }).catch(function(data){

        })
        -- 跨域问题
    restful
        -- REST 表征性状态转移 (资源状态转移)
            -- 资源
            -- URI 统一资源标志符
               URL 统一资源定位符
            -- 统一资源接口
                -- 对资源只开放一个接口
                -- 根据HTTP请求方式的不一样对资源进行不一样的操做
                -- 必定要遵循HTTP请求方式的语义
            -- 先后端传递的是资源的表述 并非资源的自己
                -- Accept
                    -- 我可以解析的数据类型
                -- ContentType
                    -- 给你响应的数据类型
            -- 资源的状态
            -- 经过超连接的指引来告诉用户还有哪些资源状态能够进入
        -- restful
            -- 只要遵循这个REST风格 咱们就叫作restful架构
        -- 规范 10条
            -- 核心思想
                -- 面向资源去编程 url尽可能用名词 不要用动词
                -- 根据method不一样对资源进行不一样操做
            -- 在url中体现
                -- 版本
                -- api
                -- 过滤条件
                -- https
            -- 返回的要求
                -- 携带状态码
                -- 返回值
                    -- get 返回查看全部数据
                    -- post 返回新增的数据
                    -- put/patch 返回更新这条数据
                    -- delete 返回值为空
                -- 返回携带错误信息
                -- 携带超连接

 

 

 restful规范

 

 

1. restful 规范(建议)
    
    2. django rest framework框架
    
内容详细:
    0. FBV、CBV
        CBV,基于反射实现根据请求方式不一样,执行不一样的方法。
        原理:
            url -> view方法 -> dispatch方法(反射执行其余:GET/POST/DELETE/PUT)
            
        流程:
            class StudentsView(View):
                def dispatch(self, request, *args, **kwargs):
                    print('before')
                    ret = super(StudentsView,self).dispatch(request, *args, **kwargs)
                    print('after')
                    return ret

                def get(self,request,*args,**kwargs):
                    return HttpResponse('GET')

                def post(self, request, *args, **kwargs):
                    return HttpResponse('POST')

                def put(self, request, *args, **kwargs):
                    return HttpResponse('PUT')

                def delete(self, request, *args, **kwargs):
                    return HttpResponse('DELETE')
    
        继承(多个类共用的功能,为了不重复编写):
            from django.views import View


            class MyBaseView(object):
                def dispatch(self, request, *args, **kwargs):
                    print('before')
                    ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
                    print('after')
                    return ret

            class StudentsView(MyBaseView,View):

                def get(self,request,*args,**kwargs):
                    print('get方法')
                    return HttpResponse('GET')

                def post(self, request, *args, **kwargs):
                    return HttpResponse('POST')

                def put(self, request, *args, **kwargs):
                    return HttpResponse('PUT')

                def delete(self, request, *args, **kwargs):
                    return HttpResponse('DELETE')

            class TeachersView(MyBaseView,View):

                def get(self,request,*args,**kwargs):
                    return HttpResponse('GET')

                def post(self, request, *args, **kwargs):
                    return HttpResponse('POST')

                def put(self, request, *args, **kwargs):
                    return HttpResponse('PUT')

                def delete(self, request, *args, **kwargs):
                    return HttpResponse('DELETE')
    
        面试题:
            1. django中间件
                - process_request
                - process_view
                - process_response
                - process_exception
                - process_render_template
            2. 使用中间件作过什么?
                - 权限
                - 用户登陆验证
                - django的csrf是如何实现?
                    process_view方法
                        - 检查视图是否被 @csrf_exempt (免除csrf认证)
                        - 去请求体或cookie中获取token
            3. 
                状况一:
                    MIDDLEWARE = [
                        'django.middleware.security.SecurityMiddleware',
                        'django.contrib.sessions.middleware.SessionMiddleware',
                        'django.middleware.common.CommonMiddleware',
                        'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf认证
                        'django.contrib.auth.middleware.AuthenticationMiddleware',
                        'django.contrib.messages.middleware.MessageMiddleware',
                        'django.middleware.clickjacking.XFrameOptionsMiddleware',
                    ]
                    
                    
                    from django.views.decorators.csrf import csrf_exempt
                    @csrf_exempt # 该函数无需认证
                    def users(request):
                        user_list = ['alex','oldboy']
                        return HttpResponse(json.dumps((user_list)))
                
                状况二:
                    MIDDLEWARE = [
                        'django.middleware.security.SecurityMiddleware',
                        'django.contrib.sessions.middleware.SessionMiddleware',
                        'django.middleware.common.CommonMiddleware',
                        #'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf认证
                        'django.contrib.auth.middleware.AuthenticationMiddleware',
                        'django.contrib.messages.middleware.MessageMiddleware',
                        'django.middleware.clickjacking.XFrameOptionsMiddleware',
                    ]
                    
                    
                    from django.views.decorators.csrf import csrf_exempt
                    @csrf_protect # 该函数需认证
                    def users(request):
                        user_list = ['alex','oldboy']
                        return HttpResponse(json.dumps((user_list)))
                    
            
        CBV小知识,csrf时须要使用
            - @method_decorator(csrf_exempt)
            - 在dispatch方法中(单独方法无效)
            
            方式一:
                from django.views.decorators.csrf import csrf_exempt,csrf_protect
                from django.utils.decorators import method_decorator
                class StudentsView(View):
                    
                    @method_decorator(csrf_exempt)
                    def dispatch(self, request, *args, **kwargs):
                        return super(StudentsView,self).dispatch(request, *args, **kwargs)

                    def get(self,request,*args,**kwargs):
                        print('get方法')
                        return HttpResponse('GET')

                    def post(self, request, *args, **kwargs):
                        return HttpResponse('POST')

                    def put(self, request, *args, **kwargs):
                        return HttpResponse('PUT')

                    def delete(self, request, *args, **kwargs):
                        return HttpResponse('DELETE')
            方式二:
                from django.views.decorators.csrf import csrf_exempt,csrf_protect
                from django.utils.decorators import method_decorator

                @method_decorator(csrf_exempt,name='dispatch')
                class StudentsView(View):

                    def get(self,request,*args,**kwargs):
                        print('get方法')
                        return HttpResponse('GET')

                    def post(self, request, *args, **kwargs):
                        return HttpResponse('POST')

                    def put(self, request, *args, **kwargs):
                        return HttpResponse('PUT')

                    def delete(self, request, *args, **kwargs):
                        return HttpResponse('DELETE')

        总结:
            - 本质,基于反射来实现
            - 流程:路由,view,dispatch(反射)
            - 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)
                
            扩展:
                - csrf 
                    - 基于中间件的process_view方法
                    - 装饰器给单独函数进行设置(认证或无需认证)
                    
                
    1. restful 规范(建议)
        a. 接口开发
            
            urlpatterns = [
                # url(r'^admin/', admin.site.urls),
                url(r'^get_order/', views.get_order),
                url(r'^add_order/', views.add_order),
                url(r'^del_order/', views.del_order),
                url(r'^update_order/', views.update_order),
            ]
            
                
            def get_order(request):
                return HttpResponse('')


            def add_order(request):
                return HttpResponse('')


            def del_order(request):
                return HttpResponse('')


            def update_order(request):
                return HttpResponse('')
                
        b. restful 规范(建议)
            
            1. 根据method不一样作不一样的操做,示例:
            
                基于FBV:
                    urlpatterns = [
                        url(r'^order/', views.order),
                    ]

                    def order(request):
                        if request.method == 'GET':
                            return HttpResponse('获取订单')
                        elif request.method == 'POST':
                            return HttpResponse('建立订单')
                        elif request.method == 'PUT':
                            return HttpResponse('更新订单')
                        elif request.method == 'DELETE':
                            return HttpResponse('删除订单')
                基于CBV:
                    urlpatterns = [
                        url(r'^order/', views.OrderView.as_view()),
                    ]
            
                    class OrderView(View):
                        def get(self,request,*args,**kwargs):
                            return HttpResponse('获取订单')

                        def post(self,request,*args,**kwargs):
                            return HttpResponse('建立订单')

                        def put(self,request,*args,**kwargs):
                            return HttpResponse('更新订单')

                        def delete(self,request,*args,**kwargs):
                            return HttpResponse('删除订单')

            
        c. 谈谈本身对restful api 规范的认识
            
            10个规则
        
            
        注意:推荐使用CBV
            
            
            
    2. django rest framework框架
        pip3 install djangorestframework
    
        a. 认证 
            - 仅使用:
                    from django.views import View
                    from rest_framework.views import APIView
                    from rest_framework.authentication import BasicAuthentication
                    from rest_framework import exceptions
                    from rest_framework.request import Request

                    class MyAuthentication(object):
                        def authenticate(self,request):
                            token = request._request.GET.get('token')
                            # 获取用户名和密码,去数据校验
                            if not token:
                                raise exceptions.AuthenticationFailed('用户认证失败')
                            return ("alex",None)

                        def authenticate_header(self,val):
                            pass

                    class DogView(APIView):
                        authentication_classes = [MyAuthentication,]

                        def get(self,request,*args,**kwargs):
                            print(request)
                            print(request.user)
                            ret  = {
                                'code':1000,
                                'msg':'xxx'
                            }
                            return HttpResponse(json.dumps(ret),status=201)

                        def post(self,request,*args,**kwargs):
                            return HttpResponse('建立Dog')

                        def put(self,request,*args,**kwargs):
                            return HttpResponse('更新Dog')

                        def delete(self,request,*args,**kwargs):
                            return HttpResponse('删除Dog')

            - 源码流程:
                dispatch...
整理笔记

 

浏览器的同源策略,会阻止跨域的访问,是在浏览器端进行阻止, ------------因此要解决跨域问题,

RESTful API设计规范,

1,使用https,安全,----------API与用户的通讯协议,老是使用HTTPs协议。
2,域名 
    https://api.example.com                         尽可能将API部署在专用域名(会存在跨域问题)
    https://example.org/api/                        API很简单,   ---------------建议用这个,
3,版本
    URL,如:https://api.example.com/v1/   -----用这个,
    请求头   跨域时,引起发送屡次请求
相关文章
相关标签/搜索