配置 jinja2
修改模板名
<code>TEMPLATES: "BACKEND": "<a href="https://www.gaodaima.com/tag/django" title="查看更多关于django的文章" target="_blank">django</a>.template.backends.<a href="https://www.gaodaima.com/tag/jinja" title="查看更多关于jinja的文章" target="_blank">jinja</a>2.Jinja2" </code>
www#gaodaima.com来源gaodai$ma#com搞$代*码*网搞代码
注释掉admin (jinja2没有admin)
<code># "django.contrib.admin", # path("admin/", admin.site.urls), </code>
创建Jinja2环境配置函数
<code>from jinja2 import Environment from django.contrib.staticfiles.storage import staticfiles_storage from django.urls import reverse def jinja2_environment(**options): """创建 jinja2 环境对象""" env = Environment(**options) env.globals.update({ "static": staticfiles_storage.url, "url": reverse, }) return env </code>
导入jinja2的配置
<code>TEMPLATES "environment": "woniumall.utils.jinja2_env.jinja2_environment" </code>
配置session,cookie的有效期
<code># 没有记住用户:浏览器会话结束就过期 request.session.set_expiry(0) # 记住用户:None表示两周后过期 request.session.set_expiry(None) # 设置cookie 为关闭浏览器则有效期结束 response.set_cookie("username", user.username) # 登录时用户名写入到cookie,有效期14天 response.set_cookie("username", user.username, max_age=3600 * 24 * 14) </code>
配置reverse
全局的urls
<code>re_path(r"^", include(("areas.urls", "areas"))) </code>
局部的urls
<code>re_path(r"^addresses/$", views.AddressView.as_view(), name="address"), re_path(r"^aaa",views.Aa.as_view()) </code>
view
<code>class AddressView(LoginRequiredMixin, View): def get(self, request): return render(request, "user_center_site.html") class Aa(View): def get(self, request): # return redirect("/addresses/") return redirect(reverse("areas:address")) </code>
authenticate 多用户登录(用户名,手机号)
配置认证后端
<code># settings/dev.py AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend", "users.auth_backend.MobilePasswordBackend"] </code>
创建自定义认证后端
<code># auth_backend.py class MobilePasswordBackend(BaseBackend): def authenticate(self, request, **kwargs): mobile = kwargs.get("username") password = kwargs.get("password") if not re.match(r"^1[3-9]d{9}$", mobile): return try: # 通过手机号查询数据库 user = UserModel.objects.get(mobile=mobile) except UserModel.DoesNotExist: return if user.check_password(password): return user def get_user(self, user_id): try: user = UserModel.objects.get(pk=user_id) except UserModel.DoesNotExist: return None return user </code>
运行流程
<code>1 加载 dev.py 2 触发 users.views.LoginView user = authenticate(username=username, password=password) 3 循环 _get_backends(return_tuples=True) # 到AUTHENTICATION_BACKENDS里面去循环,默认有一个(ModelBackend) 4 先到 django.contrib.auth.backends.ModelBackend里, 用username到数据库里找 5 没有找到, 返回循环 _get_backends(return_tuples=True) 6 再到 users.auth_backend.MobilePasswordBackend里, 用mobile在数据里找 </code>
实现状态保持(login)
<code>在认证用户(authenticate)时,会自动配置认证后端(backend),再实现状态保持(login)时,认证后端(backend)会自动绑定再用户身上; 如果没有进行认证用户(authenticate)时,用户身上则没有认证后端(backend),则要实现状态保持(login)时,就要手动绑定认证后端(backend) </code>
跨域问题(二选一)
<code>1. 再返回时设置response的请求头 response = render(request, "register.html") response["Access-Control-Allow-Origin"] = "*" return response 2. 可以再配置文件配置跨域 a) pip install django-core-header b) INSTALLED_APPS 里面添加 corsheaders c) MIDDLEWARE 里面添加 corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware d) CORS_ORIGIN_ALLOW_ALL = True, CORS_ALLOW_CREDENTIALS = True e) 配置允许访问的连接 CORS_ORIGIN_WHITELIST = ("http://127.0.0.1:8080", "http://localhost:8080", "http://www.meiduo.site:8080",) f) 配置访问方式 CORS_ALLOW_METHODS = ("DELETE","GET","OPTIONS","PATCH","POST","PUT","VIEW",) g) 配置允许访问的请求头 CORS_ALLOW_HEADERS = ( "XMLHttpRequest", "X_FILENAME", "accept-encoding", "authorization", "content-type", "dnt", "origin", "user-agent", "x-csrftoken", "x-requested-with", "Pragma", ) </code>
cookie无妨传递
<code>// 是否允许携带cookie axios.withCredentials = true; axios.defaults.withCredentials = true // 若127.0.0.1:8000可以而www.meiduo.site:8000不可以 则是因为前端的host被设置为 127.0.0.1:8000,修改前端的host </code>