Py学习  »  rzlvmp  »  全部回复
回复总数  6
3 年前
回复了 rzlvmp 创建的主题 » 在不使用Nginx的情况下使用SSL部署Django
  1. 内置开发服务器的使用( manage.py runserver )是一个 bad idea 用于生产环境。但是,是的 you can use SSL connection
  2. 更好的办法是使用一些应用服务器。例如 gunicorn .是的,你也可以 SSL connection 和gunicorn在一起。
  3. Apache或Nginx服务器不是 just for https 。这些允许您有效地控制其他服务器资源,如最大进程数、请求/响应头等。WEB服务器支持许多无需编写python代码即可设置的功能。这对infra/服务器工程师来说更容易理解。
3 年前
回复了 rzlvmp 创建的主题 » 最具python风格的方式是使用function获取用户输入

这三个例子都可以根据具体情况使用。这里没有错误的例子(除了 num1 num2 不需要作为的函数参数传递 Example3 )

我个人的看法是:

  1. 例3 这很糟糕,因为将来可能很难测试。假设你想测试一下 2 + 2 == 4 :

    def add(n1, n2):
      return n1 + n2
    
    assert 2 + 2 == add(2, 2)
    

    万一 例3 测试是不可能的 add 没有用户输入

  2. 你的函数调用了 添加 所以 添加 必须只关心添加。如果你调用你的函数 get_input_sum 然后 例3 这是最正确的

  3. 添加 名称有点宽,所以很难猜测它应该返回sum还是concat字符串?如果你叫它 sum 然后函数必须关心你在其中传递的内容:

    def sum(n1, n2):
      try:
        n1, n2 = int(n1), int(n2)
      except ValueError:
        print('Only numeric values accepted')
        raise
      return n1 + n2
    

    在这种情况下,你会确信 总和 永远都是正确的 '2' + '2' 4 但不是 '22'

    如果你投 str -> int 检查外面的类型 总和 函数您必须关心在函数编号或字符串中传递的内容。

    然而,如果 添加 更宽,你不希望看到真正的 总和 (假设你想做以下事情: [1] + [2] => [1, 2] )然后你应该检查函数之外的类型。

总之:正确答案取决于上下文

4 年前
回复了 rzlvmp 创建的主题 » 从停止的docker容器中删除文件(不创建新图像)

用别人的提示自己回答 answer

  1. 查找docker主机上存储的目录:

    export LOCAL_DIR=$(docker inspect -f '{{ .GraphDriver.Data.UpperDir }}' container_name)
    
  2. 在本地删除文件:

    sudo rm -f ${LOCAL_DIR}/run/service.pid
    
  3. 运行容器:

    docker start container_name
    

或是一应俱全:

sudo rm -f "$(docker inspect -f '{{ .GraphDriver.Data.UpperDir }}' container_name)/run/service.pid" && docker start container_name
3 年前
回复了 rzlvmp 创建的主题 » 向外部流量打开主机网络上运行的docker端口

Listening at: http://127.0.0.1:8000

意味着gunicorn在听 localhost docker集装箱公司。无法从外部网络访问容器的本地主机。你应该设定 0.0.0.0:8000 能够从外面进入。

是的,你试着设置

host = "0.0.0.0"
port = "8000"

但是古尼康 config file 没有 host port 参数。你应该使用 bind = '0.0.0.0:8000' 相反

别忘了 publish port -p 8000:8000 运行容器时

4 年前
回复了 rzlvmp 创建的主题 » 如何在Django中将数据保存到不同的模型

我想尝试在另一个表中保存数据。有最喜欢的桌子和食物桌,我需要做的是把最喜欢的模型上的食物转移到食物桌上

如何在两个相同的表之间复制数据的简单示例:

范例

from django.db import models

class Food(models.Model):
    name = models.CharField(max_length=30)
    price = models.CharField(max_length=30)

    class Meta:
        db_table = "food"

class Favorite(Food):
    class Meta:
        db_table = "favorite"

复制过程(使用 ID = 1 (进入收藏夹)

from djangoapp.models import Food, Favorite

food = Food.objects.get(id=1)
favorite = Favorite()
for attr in food._meta.fields:
  if attr.verbose_name == 'ID':
    continue
  setattr(favorite, attr.verbose_name, getattr(food, attr.verbose_name))
favorite.save()

但是在没有特殊原因的情况下,在数据库中复制数据是非常糟糕的方式。

例如,您的食物可能会在菜单中停止,但客户仍然可以在最喜欢的数据中看到它。所以你需要删除食物和最喜欢的桌子的数据

更好的方法是创建关系表,而不是复制数据:

from django.db import models

class Food(models.Model):
    name = models.CharField(max_length=30)
    price = models.CharField(max_length=30)

    class Meta:
        db_table = "food"

class Client(models.Model):

    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    class Meta:
        db_table = "client"

class Favorite(models.Model):

    client_id = models.ForeignKey(Client)
    food_id = models.ForeignKey(Food)

    class Meta:
        db_table = "favorite"

之后,您可以在收藏夹中添加新记录:

favorite = Favorite()
favorite.client_id = 1
favorite.food_id = 2
favorite.save()

这意味着 Client 具有 ID=1 补充 Food 具有 ID = 2 拥有 Favorites

在这种情况下,如果删除 食物 具有 ID=2 最爱的关系 [1,2] 也将被删除(取决于设置)。

  • 根据其他车型信息编辑1更新答案

好的,在你的情况下,将食物数据复制到收藏夹中会是这样的

def add_to_today_foods(request, pk):
  food = get_object_or_404(Food, pk=pk)
  favorite = Favorite()
  
  if request.method == 'POST':
    for attr in food._meta.fields:
      if attr.verbose_name in ['ID', 'eaten_date']:
        continue
      setattr(favorite, attr.verbose_name, getattr(food, attr.verbose_name))
    favorite.user = request.user
    favorite.save()
    return redirect('today_foods')
  context = {
    'food': food,
    'favorite': favorite,
  }
  return render(request, 'base/add_to_today_foods.html', context)

*しかし、データをコピーする方法、非常におすすめではりません。

3 年前
回复了 rzlvmp 创建的主题 » Django rest framework视图集中的chainig权限

@凯尔已经描述了这个问题,他的答案应该被接受

但我会尝试添加一些细节:

  1. 当我们链接两个权限类时,DRF会创建一个新的权限类 OR 课程:
>>> from rest_framework.permissions import IsAdminUser 
>>> or_class = [IsAdminUser | IsAdminUser]
>>> len(or_class)
1
>>> print(or_class)
[<rest_framework.permissions.OperandHolder object at 0x1096d5fa0>]
>>> 
  1. 德扬戈 documentation 他说 has_object_permission (检查确切对象的权限)方法在之后运行 has_permission (检查整个视图类的权限)

  2. 让我们看看这些方法在内部是如何链接的 课程:

>>> import inspect
>>> or_instance = or_class[0]()
>>> print(inspect.getsource(or_instance.has_permission))
    def has_permission(self, request, view):
        return (
            self.op1.has_permission(request, view) or
            self.op2.has_permission(request, view)
        )

>>> print(inspect.getsource(or_instance.has_object_permission))
    def has_object_permission(self, request, view, obj):
        return (
            self.op1.has_object_permission(request, view, obj) or
            self.op2.has_object_permission(request, view, obj)
        )

所以我们可以看到DRF检查了这两个 你有许可吗 然后我们两个 拥有_object _权限

你有许可吗 检查可能会被跳过,因为我们正在运行 拥有_object _权限 之后

但是 拥有_object _权限 没有在内部实现 IsAdminUser 权限类,但它是在父类中实现的 BasePermission 类,看起来像:

class BasePermission(metaclass=BasePermissionMetaclass):
    def has_object_permission(self, request, view, obj):
        return True

所以 艾德明 总是回来 True 在…上 拥有_object _权限 .通常情况下 艾德明 应该失败 你有许可吗 ,但在你的 你有许可吗 已通过,因为它未在内部实现 AccountOwnerPermission

最简单的解决方案是添加 你有许可吗 方法 帐户所有者权限 课程:

class AccountOwnerPermission(permissions.BasePermission):
    def has_permission(self, request, view, obj):
        return False