• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Django笔记

python 搞java代码 3年前 (2022-05-21) 14次浏览 已收录 0个评论

配置 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>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Django笔记
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址